#Data
Loading data from the UNGDC data
#Loading packages and data
library(readtext)
library(quanteda)
library(dplyr)
library(tidyr)
library(stringr)
library(ggplot2)
library(rworldmap)
library(RColorBrewer)
library(haven)
library(readxl)
DATA_DIR <- "~/Dropbox/Research/UNGDC projects/UN Data/"
ungd_files <- readtext(paste0(DATA_DIR, "TXT/*"),
docvarsfrom = "filenames",
dvsep="_",
docvarnames = c("Country", "Session", "Year"))
ungd_files$doc_id <- str_replace(ungd_files$doc_id , ".txt", "") %>%
str_replace(. , "_\\d{2}", "")
##Creating corpus object(s)
ungd_corpus <- corpus(ungd_files, text_field = "text")
ungdc.2018 <- corpus_subset(ungd_corpus, Year==2018)
rr corp_summary <- summarise(group_by(summary(ungd_corpus, n = 8093),Year), total_speeches=n(),total_sentences=sum(Sentences),total_words=sum(Tokens)) readr::write_csv(corp_summary, _summary.csv)
#Pre-processing
Tokenizing corpus.
#Tokenization and basic pre-processing
tok <- tokens(ungd_corpus, what = "word",
remove_punct = TRUE,
remove_symbols = TRUE,
remove_numbers = TRUE,
remove_twitter = TRUE,
remove_url = TRUE,
remove_hyphens = FALSE,
verbose = TRUE)
Starting tokenization...
...tokenizing 1 of 1 blocks
...preserving hyphens
...removing URLs
...indexing tokens: 88751 unique types
...total elapsed: 17.6 seconds.
Finished tokenizing and cleaning 8,640 texts.
Lowercasing and removing stopwords
tok <- tokens_tolower(tok)
tok.r <- tokens_select(tok, stopwords("english"), selection = "remove", padding = FALSE)
#Setting up agreed dictionaries
Creating compound tokens from the key terms (phrases) in our dictionaries:
mylist <- list( c("malaria"), c("diarrhoea"), c("infection"), c("disease"), c("sars"), c("measles"), c("pneumonia"), c("epidemic"), c("pandemic"), c("public", "health") , c("health","care"), c("epidemiology"), c("healthcare"), c("health"), c("mortality"), c("morbidity"), c("nutrition"), c("illness"), c("infectious"), c("ncd"), c("non-communicable", "disease"), c("noncommunicable","disease"), c("communicable", "disease"), c("air", "pollution"), c("nutrition"), c("malnutrition"), c("mental", "disorder"), c("stunting"), c("climate","change"), c("global","warming"), c("green","house"), c("temperature"), c("extreme","weather"), c("global", "environmental", "change"), c("climate","variability"), c("greenhouse"), c("low","carbon"), c("ghge"), c("renewable","energy"), c("carbon","emission"), c("co2","emission"), c("climate","pollutant"))
tok.compound <- tokens_compound(tok.r, mylist, valuetype = "fixed", concatenator = "_")
Creating the dictionary of climate change terms:
climate_dict <- dictionary(list(climate = c("climate_change", "global_warming", "green_house", "temperature", "extreme_weather", "global_environmental_change", "climate_variability", "greenhouse", "low_carbon", "ghge", "renewable_energy", "carbon_emission", "co2_emission", "climate_pollutant")))
Creating the dictionary of health terms:
health_dict <- dictionary(list(health = c("malaria", "diarrhoea", "infection", "disease", "sars", "measles", "pneumonia", "epidemic", "pandemic", "public_health", "health_care", "epidemiology", "healthcare", "health", "mortality", "morbidity", "nutrition", "illness", "infectious", "ncd", "non-communicable_disease", "noncommunicable_disease", "communicable_disease", "air_pollution", "nutrition", "malnutrition", "mental_disorder", "stunting")))
KWIC
Performing a keyword-in-context search. The window is set to 25 words before and after the term - reflecting approximately half a paragraph before and after the term (on average a paragraph in English is 50 words). UNGD speeches are highly structured documents drafted over long periods of time and reflect internal discussions and negotiations in government. Hence we assume that terms appearing within specific proximity of each other are related through the structured process of document generation.
We search for terms from our health dictionary and show the 25-word context around them.
tok.hea <- kwic(tok.compound, health_dict, window = 25, valuetype = "fixed")
readr::write_csv(tok.hea, "health_kwic_25_fixed.csv")
We search for terms from our climate change dictionary and show the 25-word context around them.
tok.cc <- kwic(tok.compound, climate_dict, window = 25, valuetype = "fixed")
readr::write_csv(tok.cc, "climate_kwic_25_fixed.csv")
To tap into the core proposition of this analysis - the link between climate change and health terms - we take the 25-word context around the health terms and search this context for climate change terms.
Text surrounding health terms (25 words each side) is saved and transformed to a corpus object. We then perform key-word-in-context search of this health related corpus for the terms in our climate change dictionary.
corpus_health <- corpus(tok.hea, split_context = FALSE, extract_keyword = TRUE)
tok.climate.kwic <- kwic(corpus_health, climate_dict, window = 25, valuetype = "fixed")
readr::write_csv(tok.climate.kwic, "intersection_kwic_25_fixed.csv")
Robustness analysis
For robustness analysis we looked at different context window sizes and manually assessed them for the balance of false positives vs false negatives.
rr tok.hea.5 <- kwic(tok.compound, health_dict, window = 5, valuetype = ) tok.cc.5 <- kwic(tok.compound, climate_dict, window = 5, valuetype = ) corpus_health.5 <- corpus(tok.hea.5, split_context = FALSE, extract_keyword = TRUE) tok.climate.kwic.5 <- kwic(corpus_health.5, climate_dict, window = 5, valuetype = ) readr::write_csv(tok.climate.kwic.5, _kwic_5_fixed.csv) readr::write_csv(tok.hea.5, _kwic_5_fixed.csv) readr::write_csv(tok.cc.5, _kwic_5_fixed.csv) tok.hea.10 <- kwic(tok.compound, health_dict, window = 10, valuetype = ) tok.cc.10 <- kwic(tok.compound, climate_dict, window = 10, valuetype = ) corpus_health.10 <- corpus(tok.hea.10, split_context = FALSE, extract_keyword = TRUE) tok.climate.kwic.10 <- kwic(corpus_health.10, climate_dict, window = 10, valuetype = ) readr::write_csv(tok.climate.kwic.10, _kwic_10_fixed.csv) readr::write_csv(tok.hea.10, _kwic_10_fixed.csv) readr::write_csv(tok.cc.10, _kwic_10_fixed.csv) tok.hea.30 <- kwic(tok.compound, health_dict, window = 30, valuetype = ) tok.cc.30 <- kwic(tok.compound, climate_dict, window = 30, valuetype = ) corpus_health.30 <- corpus(tok.hea.30, split_context = FALSE, extract_keyword = TRUE) tok.climate.kwic.30 <- kwic(corpus_health.30, climate_dict, window = 30, valuetype = ) readr::write_csv(tok.climate.kwic.30, _kwic_30_fixed.csv) readr::write_csv(tok.hea.30, _kwic_30_fixed.csv) readr::write_csv(tok.cc.30, _kwic_30_fixed.csv) tok.hea.50 <- kwic(tok.compound, health_dict, window = 50, valuetype = ) tok.cc.50 <- kwic(tok.compound, climate_dict, window = 50, valuetype = ) corpus_health.50 <- corpus(tok.hea.50, split_context = FALSE, extract_keyword = TRUE) tok.climate.kwic.50 <- kwic(corpus_health.50, climate_dict, window = 50, valuetype = ) readr::write_csv(tok.climate.kwic.50, _kwic_50_fixed.csv) readr::write_csv(tok.hea.50, _kwic_50_fixed.csv) readr::write_csv(tok.cc.50, _kwic_50_fixed.csv)
health_dfm <- dfm(corpus_health)
corpus_climate <- corpus(tok.cc, split_context = FALSE, extract_keyword = TRUE)
climate_dfm <- dfm(corpus_climate)
corpus_intersection <- corpus(tok.climate.kwic, split_context = FALSE, extract_keyword = TRUE)
intersection_dfm <- dfm(corpus_intersection)
health <- convert(health_dfm, "data.frame")
climate <- convert(climate_dfm, "data.frame")
intersection <- convert(intersection_dfm, "data.frame")
names(health)[1] <- "docid"
names(climate)[1] <- "docid"
names(intersection)[1] <- "docid"
health$"docid" <- str_extract(health$docid, "^([^.]+)")
climate$"docid" <- str_extract(climate$docid, "^([^.]+)")
intersection$"docid" <- str_extract(intersection$docid, "^([^.]+)")
health_counts <- health %>% group_by(docid) %>% summarise(health_count = n())
climate_counts <- climate %>% group_by(docid) %>% summarise(climate_count = n())
intersection_counts <- intersection %>% group_by(docid) %>% summarise(intersection_count = n())
total_counts <- climate_counts %>%
full_join(health_counts, by = "docid") %>%
full_join(intersection_counts, by = "docid") %>%
replace_na(list(health_count=0, climate_count=0, intersection_count=0)) %>%
separate(docid, c("country", "year"), "_")
total_counts$year <- as.numeric(total_counts$year)
total_counts <- arrange(total_counts, country, year)
readr::write_csv(total_counts, "total_counts.csv")
Maps of mention counts
Map for 2018 of PH and CC
Keeping only country-years with at least one mention of CC in PH conext
rr map <- joinCountryData2Map(subset(total_counts, year==2018 & health_count>0), joinCode=3, nameJoinColumn=)
100 codes from your data successfully matched countries in the map
0 codes from your data failed to match with a country code in the map
143 codes from the map weren't represented in your data
rr new_world <- subset(map, continent != ) pdf(_2018_health.pdf, width = 7, height = 3) par(mai=c(0,0,0.2,0),xaxs=,yaxs=) mapParams <- mapCountryData(new_world, nameColumnToPlot=_count, mapTitle=\2018 UN General Debate: Health, catMethod = , colourPalette = , oceanCol = , missingCountryCol = , addLegend=) do.call( addMapLegendBoxes, c(mapParams,title=of mentions,x = , horiz=TRUE, cex=0.5)) dev.off()
null device
1
rr map <- joinCountryData2Map(subset(total_counts, year==2018 & climate_count>0), joinCode=3, nameJoinColumn=)
145 codes from your data successfully matched countries in the map
1 codes from your data failed to match with a country code in the map
98 codes from the map weren't represented in your data
rr new_world <- subset(map, continent != ) pdf(_2018_climate.pdf, width = 7, height = 3) par(mai=c(0,0,0.2,0),xaxs=,yaxs=) mapParams <- mapCountryData(new_world, nameColumnToPlot=_count, mapTitle=\2018 UN General Debate: Climate Change, catMethod = , colourPalette = , oceanCol = , missingCountryCol = , addLegend=) do.call( addMapLegendBoxes, c(mapParams,title=of mentions,x = , horiz=TRUE, cex=0.5)) dev.off()
null device
1
rr map <- joinCountryData2Map(subset(total_counts, year==2018 & intersection_count>0), joinCode=3, nameJoinColumn=)
28 codes from your data successfully matched countries in the map
0 codes from your data failed to match with a country code in the map
215 codes from the map weren't represented in your data
rr new_world <- subset(map, continent != ) pdf(_2018_intersection.pdf, width = 7, height = 3) par(mai=c(0,0,0.2,0),xaxs=,yaxs=) mapParams <- mapCountryData(new_world, nameColumnToPlot=_count, mapTitle=\2018 UN General Debate: Intersection, catMethod = , colourPalette = , oceanCol = , missingCountryCol = , addLegend=) do.call( addMapLegendBoxes, c(mapParams,title=of mentions,x = , horiz=TRUE, cex=0.5)) dev.off()
null device
1
Country plots
##USA
total_counts <- total_counts %>% add_row(country = "USA", year = 2018, climate_count = 0, health_count = 0, intersection_count = 0)
ggplot(subset(total_counts, country=="USA"), aes(x=year)) +
theme_bw() +
geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
ggtitle("USA") +
ylab("Total number of references per UNGD session") + xlab("Year") +
# scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018))
ggsave("timeseries_all_total_count_USA.pdf")
Saving 7.29 x 4.51 in image

##GBR
total_counts <- total_counts %>% add_row(country = "GBR", year = 1970, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "GBR", year = 1971, climate_count = 0, health_count = 0, intersection_count = 0)
ggplot(subset(total_counts, country=="GBR"), aes(x=year)) +
theme_bw() +
geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
ggtitle("UK") +
ylab("Total number of references per UNGD session") + xlab("Year") +
# scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018))
ggsave("timeseries_all_total_count_GBR.pdf")
Saving 7.29 x 4.51 in image

##Germany
total_counts <- total_counts %>% add_row(country = "DEU", year = 1970, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "DEU", year = 1971, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "DEU", year = 1972, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "DEU", year = 1973, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "DEU", year = 1974, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "DEU", year = 1975, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "DEU", year = 1976, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "DEU", year = 1977, climate_count = 0, health_count = 0, intersection_count = 0)
ggplot(subset(total_counts, country=="DEU"), aes(x=year)) +
theme_bw() +
geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
ggtitle("Germany") +
ylab("Total number of references per UNGD session") + xlab("Year") +
# scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018))
ggsave("timeseries_all_total_count_DEU.pdf")
Saving 7.29 x 4.51 in image

##France
ggplot(subset(total_counts, country=="FRA"), aes(x=year)) +
theme_bw() +
geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
ggtitle("France") +
ylab("Total number of references per UNGD session") + xlab("Year") +
# scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018))
ggsave("timeseries_all_total_count_FRA.pdf")
Saving 7.29 x 4.51 in image

##China
total_counts <- total_counts %>% add_row(country = "CHN", year = 1971, climate_count = 0, health_count = 0, intersection_count = 0)
ggplot(subset(total_counts, country=="CHN"), aes(x=year)) +
theme_bw() +
geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
ggtitle("China") +
ylab("Total number of references per UNGD session") + xlab("Year") +
# scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018))
ggsave("timeseries_all_total_count_CHN.pdf")
Saving 7.29 x 4.51 in image

##Norway
total_counts <- total_counts %>% add_row(country = "NOR", year = 1970, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "NOR", year = 1971, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "NOR", year = 1972, climate_count = 0, health_count = 0, intersection_count = 0)
ggplot(subset(total_counts, country=="NOR"), aes(x=year)) +
theme_bw() +
geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
ggtitle("Norway") +
ylab("Total number of references per UNGD session") + xlab("Year") +
# scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018))
ggsave("timeseries_all_total_count_NOR.pdf")
Saving 7.29 x 4.51 in image

##Australia
total_counts <- total_counts %>% add_row(country = "AUS", year = 1970, climate_count = 0, health_count = 0, intersection_count = 0)
ggplot(subset(total_counts, country=="AUS"), aes(x=year)) +
theme_bw() +
geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
ggtitle("Australia") +
ylab("Total number of references per UNGD session") + xlab("Year") +
# scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018))
ggsave("timeseries_all_total_count_AUS.pdf")
Saving 7.29 x 4.51 in image

##India
total_counts <- total_counts %>% add_row(country = "IND", year = 1970, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "IND", year = 1971, climate_count = 0, health_count = 0, intersection_count = 0)
ggplot(subset(total_counts, country=="IND"), aes(x=year)) +
theme_bw() +
geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
ggtitle("India") +
ylab("Total number of references per UNGD session") + xlab("Year") +
# scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018))
ggsave("timeseries_all_total_count_IND.pdf")
Saving 7.29 x 4.51 in image

##Belgium
total_counts <- total_counts %>% add_row(country = "BEL", year = 1970, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "BEL", year = 1971, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "BEL", year = 1972, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "BEL", year = 1973, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "BEL", year = 1974, climate_count = 0, health_count = 0, intersection_count = 0)
ggplot(subset(total_counts, country=="BEL"), aes(x=year)) +
theme_bw() +
geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
ggtitle("Belgium") +
ylab("Total number of references per UNGD session") + xlab("Year") +
# scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018))
ggsave("timeseries_all_total_count_BEL.pdf")
Saving 7.29 x 4.51 in image

##Japan
total_counts <- total_counts %>% add_row(country = "JPN", year = 1970, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "JPN", year = 1971, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "JPN", year = 1972, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "JPN", year = 1973, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "JPN", year = 1974, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "JPN", year = 1975, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "JPN", year = 1976, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country = "JPN", year = 1977, climate_count = 0, health_count = 0, intersection_count = 0)
ggplot(subset(total_counts, country=="JPN"), aes(x=year)) +
theme_bw() +
geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
ggtitle("Japan") +
ylab("Total number of references per UNGD session") + xlab("Year") +
# scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018))
ggsave("timeseries_all_total_count_JPN.pdf")
Saving 7.29 x 4.51 in image

#EU
#eu presidencies
total_counts$country_alt <- total_counts$country
total_counts$country_alt[total_counts$country== "BEL" & total_counts$year == 1970] <- "EU"
total_counts$country_alt[total_counts$country== "ITA" & total_counts$year == 1971] <- "EU"
total_counts$country_alt[total_counts$country== "NLD" & total_counts$year == 1972] <- "EU"
total_counts$country_alt[total_counts$country== "DNK" & total_counts$year == 1973] <- "EU"
total_counts$country_alt[total_counts$country== "FRA" & total_counts$year == 1974] <- "EU"
total_counts$country_alt[total_counts$country== "ITA" & total_counts$year == 1975] <- "EU"
total_counts$country_alt[total_counts$country== "NLD" & total_counts$year == 1976] <- "EU"
total_counts$country_alt[total_counts$country== "BEL" & total_counts$year == 1977] <- "EU"
total_counts$country_alt[total_counts$country== "DEU" & total_counts$year == 1978] <- "EU"
total_counts$country_alt[total_counts$country== "IRL" & total_counts$year == 1979] <- "EU"
total_counts$country_alt[total_counts$country== "LUX" & total_counts$year == 1980] <- "EU"
total_counts$country_alt[total_counts$country== "GBR" & total_counts$year == 1981] <- "EU"
total_counts$country_alt[total_counts$country== "DNK" & total_counts$year == 1982] <- "EU"
total_counts$country_alt[total_counts$country== "GRC" & total_counts$year == 1983] <- "EU"
total_counts$country_alt[total_counts$country== "IRL" & total_counts$year == 1984] <- "EU"
total_counts$country_alt[total_counts$country== "LUX" & total_counts$year == 1985] <- "EU"
total_counts$country_alt[total_counts$country== "GBR" & total_counts$year == 1986] <- "EU"
total_counts$country_alt[total_counts$country== "DNK" & total_counts$year == 1987] <- "EU"
total_counts$country_alt[total_counts$country== "GRC" & total_counts$year == 1988] <- "EU"
total_counts$country_alt[total_counts$country== "FRA" & total_counts$year == 1989] <- "EU"
total_counts$country_alt[total_counts$country== "ITA" & total_counts$year == 1990] <- "EU"
total_counts$country_alt[total_counts$country== "NLD" & total_counts$year == 1991] <- "EU"
total_counts$country_alt[total_counts$country== "GBR" & total_counts$year == 1992] <- "EU"
total_counts$country_alt[total_counts$country== "BEL" & total_counts$year == 1993] <- "EU"
total_counts$country_alt[total_counts$country== "DEU" & total_counts$year == 1994] <- "EU"
total_counts$country_alt[total_counts$country== "ESP" & total_counts$year == 1995] <- "EU"
total_counts$country_alt[total_counts$country== "IRL" & total_counts$year == 1996] <- "EU"
total_counts$country_alt[total_counts$country== "LUX" & total_counts$year == 1997] <- "EU"
total_counts$country_alt[total_counts$country== "AUT" & total_counts$year == 1998] <- "EU"
total_counts$country_alt[total_counts$country== "FIN" & total_counts$year == 1999] <- "EU"
total_counts$country_alt[total_counts$country== "FRA" & total_counts$year == 2000] <- "EU"
total_counts$country_alt[total_counts$country== "BEL" & total_counts$year == 2001] <- "EU"
total_counts$country_alt[total_counts$country== "DNK" & total_counts$year == 2002] <- "EU"
total_counts$country_alt[total_counts$country== "ITA" & total_counts$year == 2003] <- "EU"
total_counts$country_alt[total_counts$country== "NLD" & total_counts$year == 2004] <- "EU"
total_counts$country_alt[total_counts$country== "GBR" & total_counts$year == 2005] <- "EU"
total_counts$country_alt[total_counts$country== "FIN" & total_counts$year == 2006] <- "EU"
total_counts$country_alt[total_counts$country== "PRT" & total_counts$year == 2007] <- "EU"
total_counts$country_alt[total_counts$country== "FRA" & total_counts$year == 2008] <- "EU"
total_counts$country_alt[total_counts$country== "SWE" & total_counts$year == 2009] <- "EU"
total_counts$country_alt[total_counts$country== "BEL" & total_counts$year == 2010] <- "EU"
total_counts <- total_counts %>% add_row(country_alt = "EU", year = 1970, climate_count = 0, health_count = 0, intersection_count = 0) %>% add_row(country_alt = "EU", year = 1971, climate_count = 0, health_count = 0, intersection_count = 0)
ggplot(subset(total_counts, country_alt=="EU"), aes(x=year)) +
theme_bw() +
geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
ggtitle("EU") +
ylab("Total number of references per UNGD session") + xlab("Year") +
# scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018))
ggsave("timeseries_all_total_count_EU.pdf")
Saving 7.29 x 4.51 in image

Time series of total counts plot
total counts
# calculating the total number of mentions by year
sum <- summarise(group_by(total_counts, year),
sum_CC = sum(climate_count), sum_PH = sum(health_count), sum_int = sum(intersection_count),
mean_CC = mean(climate_count), mean_PH = mean(health_count), mean_int = mean(intersection_count))
There were 43 warnings (use warnings() to see them)
rr ggplot(sum, aes(x=year)) + theme_bw() + geom_line(aes(y= sum_PH), colour = , alpha = 0.9, linetype=) + geom_line(aes(y= sum_CC), colour = , alpha = 0.9, linetype=) + # geom_line(aes(y= count), colour = , alpha = 0.9) + #ggtitle(engagement with the intersection of climate change and health) + ylab(number of references per UNGD session) + xlab() + # scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) + scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018))+ annotate(, x = 2000, y = 850, label = Change, colour = )+ annotate(, x = 1993, y = 250, label = , colour = ) ggsave(_PHCC_total_count.pdf)
Saving 7.29 x 4.51 in image

ggplot(sum, aes(x=year)) +
theme_bw() +
geom_line(aes(y= sum_int), colour = "red", alpha = 0.9) +
ylab("Total number of references per UNGD session") + xlab("Year") +
# scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018)) +
annotate("text", x = 2015, y = 20, label = "Intersection", colour = "red")
ggsave("timeseries_intersection_total_count.pdf")
Saving 7.29 x 4.51 in image

readr::write_csv(sum, "figure57.csv")
rr ggplot(sum, aes(x=year)) + theme_bw() + geom_line(aes(y= sum_PH), colour = , alpha = 0.9, linetype=) + geom_line(aes(y= sum_CC), colour = , alpha = 0.9, linetype=) + geom_line(aes(y= sum_int), colour = , alpha = 0.9) + #ggtitle(engagement with the intersection of climate change and health) + ylab(number of references per UNGD session) + xlab() + # scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) + scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018))+ annotate(, x = 2000, y = 850, label = Change, colour = )+ annotate(, x = 1993, y = 250, label = , colour = ) + annotate(, x = 2015, y = 100, label = , colour = ) ggsave(_all_total_count.pdf)
Saving 7.29 x 4.51 in image

Proportion of countries presentation
Proportion of countries that had at least one mention
Data preparation
climate_speeches <- total_counts %>% filter(climate_count>0) %>% group_by(year) %>% tally(name = "climate_speeches")
There were 50 or more warnings (use warnings() to see the first 50)
health_speeches <- total_counts %>% filter(health_count>0) %>% group_by(year) %>% tally(name = "health_speeches")
intersection_speeches <- total_counts %>% filter(intersection_count>0) %>% group_by(year) %>% tally(name = "intersection_speeches")
total_speeches <- ungd_files %>% group_by(Year) %>% tally(name = "total_speeches")
proportions <- left_join(total_speeches, health_speeches, by = c("Year"="year")) %>%
left_join(., climate_speeches, by = c("Year"="year")) %>%
left_join(., intersection_speeches, by = c("Year"="year")) %>%
replace_na(list(health_speeches=0, climate_speeches=0, intersection_speeches=0))
proportions$percent_int <- proportions$intersection_speeches/proportions$total_speeches*100
proportions$percent_CC <- proportions$climate_speeches/proportions$total_speeches*100
proportions$percent_PH <- proportions$health_speeches/proportions$total_speeches*100
readr::write_csv(proportions, "figure28.csv")
Plotting the country proportion
rr ggplot(proportions, aes(x=Year, y=percent_CC, group = 1)) + geom_line(colour=, size=1) + theme_bw() + #ggtitle(engagement with the intersection of climate change and health) + ylab(of countries discussing climate change
<!-- rnb-source-end -->
<!-- rnb-output-begin eyJkYXRhIjoiU2F2aW5nIDcuMjkgeCA0LjUxIGluIGltYWdlXG4ifQ== -->
Saving 7.29 x 4.51 in image ```

rr ggplot(proportions, aes(x=Year, y=percent_PH, group = 1)) + geom_line(colour=, size=1) + theme_bw() + #ggtitle(engagement with the intersection of climate change and health) + ylab(of countries discussing health
<!-- rnb-source-end -->
<!-- rnb-output-begin eyJkYXRhIjoiU2F2aW5nIDcuMjkgeCA0LjUxIGluIGltYWdlXG4ifQ== -->
Saving 7.29 x 4.51 in image ```

rr ggplot(proportions, aes(x=Year, y=percent_int, group = 1)) + geom_line(colour=, size=1) + theme_bw() + #ggtitle(engagement with the intersection of climate change and health) + ylab(of countries discussing intersection
<!-- rnb-source-end -->
<!-- rnb-output-begin eyJkYXRhIjoiU2F2aW5nIDcuMjkgeCA0LjUxIGluIGltYWdlXG4ifQ== -->
Saving 7.29 x 4.51 in image ```

ggplot(proportions, aes(x=Year)) +
geom_line(aes(y=percent_int), colour="red", size=1) +
geom_line(aes(y=percent_CC), colour="darkgreen", linetype = "dashed", size=1) +
geom_line(aes(y=percent_PH), colour="blue", linetype = "dotdash", size=1) +
theme_bw() +
#ggtitle("Political engagement with the intersection of climate change and health") +
ylab("Proportion of countries, %") + xlab("Year") +
scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018))+
annotate("text", x = 2014, y = 30, label = "Intersection", colour = "red")+
annotate("text", x = 1975, y = 55, label = "Health", colour = "blue") +
annotate("text", x = 1988, y = 27, label = "Climate Change", colour = "darkgreen")
There were 50 or more warnings (use warnings() to see the first 50)
ggsave("all_three_percent.pdf")
Saving 7.29 x 4.51 in image

#Tier Analysis
rr sids_countries <- c(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) tier1_countries <- c(,, ) tier2_countries <- c(,, , , , , , , ) total_counts\(country_groups <- ifelse(total_counts\)country %in% sids_countries, , ) total_counts\(country_groups[total_counts\)country %in% tier1_countries] <- 1
total_counts\(country_groups[total_counts\)country %in% tier2_countries] <- 2
#eu presidencies total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 1970] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \ITA\ & total_counts\)year == 1971] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 1972] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \DNK\ & total_counts\)year == 1973] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 1974] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \ITA\ & total_counts\)year == 1975] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 1976] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \BEL\ & total_counts\)year == 1977] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 1978] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \IRL\ & total_counts\)year == 1979] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 1980] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \GBR\ & total_counts\)year == 1981] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 1982] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \GRC\ & total_counts\)year == 1983] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 1984] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \LUX\ & total_counts\)year == 1985] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 1986] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \DNK\ & total_counts\)year == 1987] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 1988] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \FRA\ & total_counts\)year == 1989] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 1990] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \NLD\ & total_counts\)year == 1991] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 1992] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \BEL\ & total_counts\)year == 1993] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 1994] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \ESP\ & total_counts\)year == 1995] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 1996] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \LUX\ & total_counts\)year == 1997] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 1998] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \FIN\ & total_counts\)year == 1999] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 2000] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \BEL\ & total_counts\)year == 2001] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 2002] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \ITA\ & total_counts\)year == 2003] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 2004] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \GBR\ & total_counts\)year == 2005] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 2006] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \PRT\ & total_counts\)year == 2007] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 2008] <- \Tier1\
total_counts\)country_groups[total_counts\(country== \SWE\ & total_counts\)year == 2009] <- 1
total_counts\(country_groups[total_counts\)country== Â & total_counts\(year == 2010] <- \Tier1\
ungd_files\)country_groups <- ifelse(ungd_files\(Country %in% sids_countries, \SIDS\, \none\) ungd_files\)country_groups[ungd_files$Country %in% tier1_countries] <- 1
ungd_files\(country_groups[ungd_files\)Country %in% tier2_countries] <- 2
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 1970] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \ITA\ & ungd_files\)Year == 1971] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 1972] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \DNK\ & ungd_files\)Year == 1973] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 1974] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \ITA\ & ungd_files\)Year == 1975] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 1976] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \BEL\ & ungd_files\)Year == 1977] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 1978] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \IRL\ & ungd_files\)Year == 1979] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 1980] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \GBR\ & ungd_files\)Year == 1981] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 1982] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \GRC\ & ungd_files\)Year == 1983] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 1984] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \LUX\ & ungd_files\)Year == 1985] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 1986] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \DNK\ & ungd_files\)Year == 1987] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 1988] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \FRA\ & ungd_files\)Year == 1989] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 1990] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \NLD\ & ungd_files\)Year == 1991] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 1992] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \BEL\ & ungd_files\)Year == 1993] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 1994] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \ESP\ & ungd_files\)Year == 1995] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 1996] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \LUX\ & ungd_files\)Year == 1997] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 1998] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \FIN\ & ungd_files\)Year == 1999] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 2000] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \BEL\ & ungd_files\)Year == 2001] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 2002] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \ITA\ & ungd_files\)Year == 2003] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 2004] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \GBR\ & ungd_files\)Year == 2005] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 2006] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \PRT\ & ungd_files\)Year == 2007] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files\(Year == 2008] <- \Tier1\
ungd_files\)country_groups[ungd_files\(Country== \SWE\ & ungd_files\)Year == 2009] <- 1
ungd_files\(country_groups[ungd_files\)Country== Â & ungd_files$Year == 2010] <- 1
rr climate_speeches_groups <- total_counts %>% filter(climate_count>0) %>% group_by(year, country_groups) %>% tally(name = _speeches) health_speeches_groups <- total_counts %>% filter(health_count>0) %>% group_by(year, country_groups) %>% tally(name = _speeches) intersection_speeches_groups <- total_counts %>% filter(intersection_count>0) %>% group_by(year, country_groups) %>% tally(name = _speeches) total_speeches_groups <- ungd_files %>% group_by(Year, country_groups) %>% tally(name = _speeches) proportions_groups <- left_join(total_speeches_groups, health_speeches_groups, by = c(=, _groups)) %>% left_join(., climate_speeches_groups, by = c(=, _groups)) %>% left_join(., intersection_speeches_groups, by = c(=, _groups)) %>% replace_na(list(health_speeches=0, climate_speeches=0, intersection_speeches=0)) proportions_groups\(percent_int <- proportions_groups\)intersection_speeches/proportions_groups\(total_speeches*100 proportions_groups\)percent_CC <- proportions_groups\(climate_speeches/proportions_groups\)total_speeches100 proportions_groups\(percent_PH <- proportions_groups\)health_speeches/proportions_groups$total_speeches100 proportions_groups <- proportions_groups %>% filter(country_groups!=)
##Total count plots by country group
rr ggplot(proportions_groups, aes(x=Year, y=health_speeches, group=country_groups, linetype = country_groups, colour = country_groups)) + geom_line() + guides(colour=guide_legend(title=NULL), linetype = FALSE) + guides(linetype=guide_legend(title=NULL)) + theme_bw() + ggtitle() + ylab(number of references per UNGD session) + xlab() + theme(legend.position=) + scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018)) ggsave(_total_by_country_group.pdf)
Saving 7.29 x 4.51 in image

rr ggplot(proportions_groups, aes(x=Year, y=climate_speeches, group=country_groups, linetype = country_groups, colour = country_groups)) + geom_line() + guides(colour=guide_legend(title=NULL), linetype = FALSE) + guides(linetype=guide_legend(title=NULL)) + theme_bw() + ggtitle(Change) + ylab(number of references per UNGD session) + xlab() + theme(legend.position=) + scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018)) ggsave(_total_by_country_group.pdf)
Saving 7.29 x 4.51 in image

rr ggplot(proportions_groups, aes(x=Year, y=intersection_speeches, group=country_groups, linetype = country_groups, colour = country_groups)) + geom_line() + guides(colour=guide_legend(title=NULL), linetype = FALSE) + guides(linetype=guide_legend(title=NULL)) + theme_bw() + ggtitle() + ylab(number of references per UNGD session) + xlab() + theme(legend.position=) + scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018)) ggsave(_total_by_country_group.pdf)
Saving 7.29 x 4.51 in image

##Proportion plots by country group
rr ggplot(proportions_groups, aes(x=Year, y=percent_PH, group=country_groups, linetype = country_groups, colour = country_groups)) + geom_line() + guides(colour=guide_legend(title=NULL), linetype = FALSE) + guides(linetype=guide_legend(title=NULL)) + theme_bw() + ggtitle(of Health) + ylab(of Countries
<!-- rnb-source-end -->
<!-- rnb-output-begin eyJkYXRhIjoiU2F2aW5nIDcuMjkgeCA0LjUxIGluIGltYWdlXG4ifQ== -->
Saving 7.29 x 4.51 in image ```

rr ggplot(proportions_groups, aes(x=Year, y=percent_CC, group=country_groups, linetype = country_groups, colour = country_groups)) + geom_line() + guides(colour=guide_legend(title=NULL), linetype = FALSE) + guides(linetype=guide_legend(title=NULL)) + theme_bw() + ggtitle(of Climate Change) + ylab(of Countries
<!-- rnb-source-end -->
<!-- rnb-output-begin eyJkYXRhIjoiU2F2aW5nIDcuMjkgeCA0LjUxIGluIGltYWdlXG4ifQ== -->
Saving 7.29 x 4.51 in image ```

rr ggplot(proportions_groups, aes(x=Year, y=percent_int, group=country_groups, linetype = country_groups, colour = country_groups)) + geom_line() + guides(colour=guide_legend(title=NULL), linetype = FALSE) + guides(linetype=guide_legend(title=NULL)) + theme_bw() + ggtitle(of intersection) + ylab(of Countries
<!-- rnb-source-end -->
<!-- rnb-output-begin eyJkYXRhIjoiU2F2aW5nIDcuMjkgeCA0LjUxIGluIGltYWdlXG4ifQ== -->
Saving 7.29 x 4.51 in image ```

#WHO regions
Total counts by WHO region
Using UN M49 Standard (Standard country or area codes for statistical use (M49)) we create regional and sub-regional groupings of countries. [https://unstats.un.org/unsd/methodology/m49/]
#loading WHO regions country identifiers and preprocessing
regions <- readr::read_csv("../UNSD - Methodology.csv")
Parsed with column specification:
cols(
`Global Code` = [32mcol_double()[39m,
`Global Name` = [31mcol_character()[39m,
`Region Code` = [32mcol_double()[39m,
WHO = [31mcol_character()[39m,
`Region Name` = [31mcol_character()[39m,
`Sub-region Code` = [32mcol_double()[39m,
`Sub-region Name` = [31mcol_character()[39m,
`Intermediate Region Code` = [32mcol_double()[39m,
`Intermediate Region Name` = [31mcol_character()[39m,
`Country or Area` = [31mcol_character()[39m,
`M49 Code` = [32mcol_double()[39m,
`ISO-alpha3 Code` = [31mcol_character()[39m,
`Least Developed Countries (LDC)` = [31mcol_character()[39m,
`Land Locked Developing Countries (LLDC)` = [31mcol_character()[39m,
`Small Island Developing States (SIDS)` = [31mcol_character()[39m,
`Developed / Developing Countries` = [31mcol_character()[39m
)
There were 50 or more warnings (use warnings() to see the first 50)
#UNGDC used YUG designation while WHO is using SRB
total_counts$country <- str_replace(total_counts$country, "YUG", "SRB")
#merging WHO designations with mention counts
regional_data <- inner_join(total_counts, regions, by = c("country" = "ISO-alpha3 Code"))
# total sum of mention counts by year and WHO region, with means
who_sum <- summarise(group_by(regional_data, year, WHO),
who_int = sum(intersection_count), who_PH = sum(health_count), who_CC = sum(climate_count))
readr::write_csv(regional_data, "who_regions_data.csv")
readr::write_csv(who_sum, "figure58.csv")
Plot by region
rr ggplot(who_sum, aes(x=year, y=who_PH, group=WHO, linetype = WHO, colour = WHO)) + geom_line() + guides(colour=guide_legend(title=NULL), linetype = FALSE) + guides(linetype=guide_legend(title=NULL)) + theme_bw() + ggtitle() + ylab(number of references per UNGD session) + xlab() + theme(legend.position=) + scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018)) ggsave(_total_by_who.pdf)
Saving 7.29 x 4.51 in image

rr ggplot(who_sum, aes(x=year, y=who_CC, group=WHO, linetype = WHO, colour = WHO)) + geom_line() + guides(colour=guide_legend(title=NULL), linetype = FALSE) + guides(linetype=guide_legend(title=NULL)) + theme_bw() + ggtitle(Change) + ylab(number of references per UNGD session) + xlab() + theme(legend.position=) + scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018)) ggsave(_total_by_who.pdf)
Saving 7.29 x 4.51 in image

ggplot(who_sum, aes(x=year, y=who_int, group=WHO, linetype = WHO, colour = WHO)) +
geom_line() +
guides(colour=guide_legend(title=NULL), linetype = FALSE) +
guides(linetype=guide_legend(title=NULL)) +
theme_bw() +
ggtitle("Intersection") +
ylab("Total number of references per UNGD session") + xlab("Year") +
theme(legend.position="bottom") +
scale_x_continuous(limits=c(1970, 2018), breaks = c(1970, 1980, 1990, 2000, 2010, 2018))
ggsave("intersection_total_by_who.pdf")
Saving 7.29 x 4.51 in image

Proportion by WHO region
Data preparation
climate_speeches_who <- regional_data %>% filter(climate_count>0) %>% group_by(year, WHO) %>% tally(name = "climate_speeches")
health_speeches_who <- regional_data %>% filter(health_count>0) %>% group_by(year, WHO) %>% tally(name = "health_speeches")
intersection_speeches_who <- regional_data %>% filter(intersection_count>0) %>% group_by(year, WHO) %>% tally(name = "intersection_speeches")
#merging WHO designations with mention counts
ungd_files$Country <- str_replace(ungd_files$Country, "YUG", "SRB")
total_speeches_who <- inner_join(ungd_files, regions, by = c("Country" = "ISO-alpha3 Code")) %>%
group_by(Year, WHO) %>% tally(name = "total_speeches")
proportions_who <- left_join(total_speeches_who, health_speeches_who, by = c("Year"="year", "WHO")) %>%
left_join(., climate_speeches_who, by = c("Year"="year", "WHO")) %>%
left_join(., intersection_speeches_who, by = c("Year"="year", "WHO")) %>%
replace_na(list(health_speeches=0, climate_speeches=0, intersection_speeches=0))
proportions_who$percent_int <- proportions_who$intersection_speeches/proportions_who$total_speeches*100
proportions_who$percent_CC <- proportions_who$climate_speeches/proportions_who$total_speeches*100
proportions_who$percent_PH <- proportions_who$health_speeches/proportions_who$total_speeches*100
readr::write_csv(proportions_who, "figure56.csv")
Plotting
rr ggplot(proportions_who, aes(x=Year, y=percent_PH, group=WHO, linetype = WHO, colour = WHO)) + geom_line() + guides(colour=guide_legend(title=NULL), linetype = FALSE) + guides(linetype=guide_legend(title=NULL)) + theme_bw() + ggtitle(of Health) + ylab(of Countries
<!-- rnb-source-end -->
<!-- rnb-output-begin eyJkYXRhIjoiU2F2aW5nIDcuMjkgeCA0LjUxIGluIGltYWdlXG4ifQ== -->
Saving 7.29 x 4.51 in image ```

rr ggplot(proportions_who, aes(x=Year, y=percent_CC, group=WHO, linetype = WHO, colour = WHO)) + geom_line() + guides(colour=guide_legend(title=NULL), linetype = FALSE) + guides(linetype=guide_legend(title=NULL)) + theme_bw() + ggtitle(of Climate Change) + ylab(of Countries
<!-- rnb-source-end -->
<!-- rnb-output-begin eyJkYXRhIjoiU2F2aW5nIDcuMjkgeCA0LjUxIGluIGltYWdlXG4ifQ== -->
Saving 7.29 x 4.51 in image ```

rr ggplot(proportions_who, aes(x=Year, y=percent_int, group=WHO, linetype = WHO, colour = WHO)) + geom_line() + guides(colour=guide_legend(title=NULL), linetype = FALSE) + guides(linetype=guide_legend(title=NULL)) + theme_bw() + ggtitle(of Intersection) + ylab(of countries
<!-- rnb-source-end -->
<!-- rnb-output-begin eyJkYXRhIjoiU2F2aW5nIDcuMjkgeCA0LjUxIGluIGltYWdlXG4ifQ== -->
Saving 7.29 x 4.51 in image ```

LS0tCnRpdGxlOiAiQ2xpbWF0ZSBDaGFuZ2UgYW5kIFB1YmxpYyBIZWFsdGgiCmF1dGhvcjoKLSBhZmZpbGlhdGlvbjogVW5pdmVyc2l0eSBvZiBCaXJtaW5naGFtCiAgZW1haWw6IG4uZGFzYW5kaUBiaGFtLmFjLnVrCiAgbmFtZTogTmloZWVyIERhc2FuZGkKLSBhZmZpbGlhdGlvbjogVW5pdmVyc2l0eSBvZiBFc3NleAogIGVtYWlsOiBzLm1pa2hheWxvdkBlc3NleC5hYy51awogIG5hbWU6IFNsYXZhIEphbmtpbiBNaWtoYXlsb3YKLSBhZmZpbGlhdGlvbjogVGhlIExhbmNldCwgVW5pdmVyc2l0eSBDb2xsZWdlIExvbmRvbgogIGVtYWlsOiBuLndhdHRzQHVjbC5hYy51awogIG5hbWU6IE5pY2sgV2F0dHMKZGF0ZTogMjkgTWFyY2ggMjAxOQpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogCiAgICB0b2M6IHllcwogIHdvcmRfZG9jdW1lbnQ6IAogICAgdG9jOiB5ZXMKI2JpYmxpby1zdHlsZTogYXBzcgojYmlibGlvZ3JhcGh5OiBldS5iaWIKdGhhbmtzOiBXZSB0aGFuayBUcnVtcCBBZG1pbmlzdHJhdGlvbiBmb3IgdGhlaXIgZ2VuZXJvdXMgc3VwcG9ydCBvZiBjbGltYXRlIGNoYW5nZSBpbml0aWF0aXZlcy4KYWJzdHJhY3Q6IFdlIGxvb2sgYXQgdGhlIGxpbmsgYmV0d2VlbiBwdWJsaWMgaGVhbHRoIGlzc3VlcyBhbmQgY2xpbWF0ZSBjaGFuZ2UgZGlzY3Vzc2VkIGluIHRoZSBVTiBHZW5lcmFsIERlYmF0ZXMuCgotLS0KCgoKI0RhdGEKCkxvYWRpbmcgZGF0YSBmcm9tIHRoZSBVTkdEQyBkYXRhCgoKYGBge3IgbWVzc2FnZT1GQUxTRX0KI0xvYWRpbmcgcGFja2FnZXMgYW5kIGRhdGEKbGlicmFyeShyZWFkdGV4dCkKbGlicmFyeShxdWFudGVkYSkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocndvcmxkbWFwKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShoYXZlbikKbGlicmFyeShyZWFkeGwpCmBgYAoKYGBge3J9CgpEQVRBX0RJUiA8LSAifi9Ecm9wYm94L1Jlc2VhcmNoL1VOR0RDIHByb2plY3RzL1VOIERhdGEvIiAKCnVuZ2RfZmlsZXMgPC0gcmVhZHRleHQocGFzdGUwKERBVEFfRElSLCAiVFhULyoiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3ZhcnNmcm9tID0gImZpbGVuYW1lcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdnNlcD0iXyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N2YXJuYW1lcyA9IGMoIkNvdW50cnkiLCAiU2Vzc2lvbiIsICJZZWFyIikpCgoKdW5nZF9maWxlcyRkb2NfaWQgPC0gc3RyX3JlcGxhY2UodW5nZF9maWxlcyRkb2NfaWQgLCAiLnR4dCIsICIiKSAlPiUKICAgc3RyX3JlcGxhY2UoLiAsICJfXFxkezJ9IiwgIiIpCgpgYGAKCgojI0NyZWF0aW5nIGNvcnB1cyBvYmplY3QocykKYGBge3J9CnVuZ2RfY29ycHVzIDwtIGNvcnB1cyh1bmdkX2ZpbGVzLCB0ZXh0X2ZpZWxkID0gInRleHQiKSAKCnVuZ2RjLjIwMTggPC0gY29ycHVzX3N1YnNldCh1bmdkX2NvcnB1cywgWWVhcj09MjAxOCkKCmBgYAoKCgpgYGB7cn0KCmNvcnBfc3VtbWFyeSA8LSBzdW1tYXJpc2UoZ3JvdXBfYnkoc3VtbWFyeSh1bmdkX2NvcnB1cywgbiA9IDgwOTMpLFllYXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9zcGVlY2hlcz1uKCksdG90YWxfc2VudGVuY2VzPXN1bShTZW50ZW5jZXMpLHRvdGFsX3dvcmRzPXN1bShUb2tlbnMpKQoKcmVhZHI6OndyaXRlX2Nzdihjb3JwX3N1bW1hcnksICJjb3JwX3N1bW1hcnkuY3N2IikKCmBgYAoKCgoKI1ByZS1wcm9jZXNzaW5nCgpUb2tlbml6aW5nIGNvcnB1cy4KCmBgYHtyfQojVG9rZW5pemF0aW9uIGFuZCBiYXNpYyBwcmUtcHJvY2Vzc2luZwp0b2sgPC0gdG9rZW5zKHVuZ2RfY29ycHVzLCB3aGF0ID0gIndvcmQiLAogICAgICAgICAgICAgIHJlbW92ZV9wdW5jdCA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlX3N5bWJvbHMgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZV9udW1iZXJzID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVfdHdpdHRlciA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlX3VybCA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlX2h5cGhlbnMgPSBGQUxTRSwKICAgICAgICAgICAgICB2ZXJib3NlID0gVFJVRSkKYGBgCgpMb3dlcmNhc2luZyBhbmQgcmVtb3Zpbmcgc3RvcHdvcmRzCgpgYGB7cn0KdG9rIDwtIHRva2Vuc190b2xvd2VyKHRvaykKdG9rLnIgPC0gdG9rZW5zX3NlbGVjdCh0b2ssIHN0b3B3b3JkcygiZW5nbGlzaCIpLCBzZWxlY3Rpb24gPSAicmVtb3ZlIiwgcGFkZGluZyA9IEZBTFNFKQoKYGBgCgojU2V0dGluZyB1cCBhZ3JlZWQgZGljdGlvbmFyaWVzCgpDcmVhdGluZyBjb21wb3VuZCB0b2tlbnMgZnJvbSB0aGUga2V5IHRlcm1zIChwaHJhc2VzKSBpbiBvdXIgZGljdGlvbmFyaWVzOgogCmBgYHtyfQoKbXlsaXN0IDwtIGxpc3QoIGMoIm1hbGFyaWEiKSwgYygiZGlhcnJob2VhIiksIGMoImluZmVjdGlvbiIpLCBjKCJkaXNlYXNlIiksIGMoInNhcnMiKSwgYygibWVhc2xlcyIpLCBjKCJwbmV1bW9uaWEiKSwgYygiZXBpZGVtaWMiKSwgYygicGFuZGVtaWMiKSwgYygicHVibGljIiwgImhlYWx0aCIpICwgYygiaGVhbHRoIiwiY2FyZSIpLCBjKCJlcGlkZW1pb2xvZ3kiKSwgYygiaGVhbHRoY2FyZSIpLCBjKCJoZWFsdGgiKSwgYygibW9ydGFsaXR5IiksIGMoIm1vcmJpZGl0eSIpLCBjKCJudXRyaXRpb24iKSwgYygiaWxsbmVzcyIpLCBjKCJpbmZlY3Rpb3VzIiksIGMoIm5jZCIpLCBjKCJub24tY29tbXVuaWNhYmxlIiwgImRpc2Vhc2UiKSwgYygibm9uY29tbXVuaWNhYmxlIiwiZGlzZWFzZSIpLCBjKCJjb21tdW5pY2FibGUiLCAiZGlzZWFzZSIpLCBjKCJhaXIiLCAicG9sbHV0aW9uIiksIGMoIm51dHJpdGlvbiIpLCBjKCJtYWxudXRyaXRpb24iKSwgYygibWVudGFsIiwgImRpc29yZGVyIiksIGMoInN0dW50aW5nIiksIGMoImNsaW1hdGUiLCJjaGFuZ2UiKSwgYygiZ2xvYmFsIiwid2FybWluZyIpLCBjKCJncmVlbiIsImhvdXNlIiksIGMoInRlbXBlcmF0dXJlIiksIGMoImV4dHJlbWUiLCJ3ZWF0aGVyIiksIGMoImdsb2JhbCIsICJlbnZpcm9ubWVudGFsIiwgImNoYW5nZSIpLCBjKCJjbGltYXRlIiwidmFyaWFiaWxpdHkiKSwgYygiZ3JlZW5ob3VzZSIpLCBjKCJsb3ciLCJjYXJib24iKSwgYygiZ2hnZSIpLCBjKCJyZW5ld2FibGUiLCJlbmVyZ3kiKSwgYygiY2FyYm9uIiwiZW1pc3Npb24iKSwgYygiY28yIiwiZW1pc3Npb24iKSwgYygiY2xpbWF0ZSIsInBvbGx1dGFudCIpKSAKIApgYGAKIAoKYGBge3J9CnRvay5jb21wb3VuZCA8LSB0b2tlbnNfY29tcG91bmQodG9rLnIsIG15bGlzdCwgdmFsdWV0eXBlID0gImZpeGVkIiwgY29uY2F0ZW5hdG9yID0gIl8iKQpgYGAKCgpDcmVhdGluZyB0aGUgZGljdGlvbmFyeSBvZiBjbGltYXRlIGNoYW5nZSB0ZXJtczoKCmBgYHtyfQpjbGltYXRlX2RpY3QgPC0gZGljdGlvbmFyeShsaXN0KGNsaW1hdGUgPSAgYygiY2xpbWF0ZV9jaGFuZ2UiLCAiZ2xvYmFsX3dhcm1pbmciLCAiZ3JlZW5faG91c2UiLCAidGVtcGVyYXR1cmUiLCAiZXh0cmVtZV93ZWF0aGVyIiwgImdsb2JhbF9lbnZpcm9ubWVudGFsX2NoYW5nZSIsICJjbGltYXRlX3ZhcmlhYmlsaXR5IiwgImdyZWVuaG91c2UiLCAibG93X2NhcmJvbiIsICJnaGdlIiwgInJlbmV3YWJsZV9lbmVyZ3kiLCAiY2FyYm9uX2VtaXNzaW9uIiwgImNvMl9lbWlzc2lvbiIsICJjbGltYXRlX3BvbGx1dGFudCIpKSkKCmBgYAoKQ3JlYXRpbmcgdGhlIGRpY3Rpb25hcnkgb2YgaGVhbHRoIHRlcm1zOgoKYGBge3J9CmhlYWx0aF9kaWN0IDwtIGRpY3Rpb25hcnkobGlzdChoZWFsdGggPSBjKCJtYWxhcmlhIiwgImRpYXJyaG9lYSIsICJpbmZlY3Rpb24iLCAiZGlzZWFzZSIsICJzYXJzIiwgIm1lYXNsZXMiLCAicG5ldW1vbmlhIiwgImVwaWRlbWljIiwgInBhbmRlbWljIiwgInB1YmxpY19oZWFsdGgiLCAiaGVhbHRoX2NhcmUiLCAiZXBpZGVtaW9sb2d5IiwgImhlYWx0aGNhcmUiLCAiaGVhbHRoIiwgIm1vcnRhbGl0eSIsICJtb3JiaWRpdHkiLCAibnV0cml0aW9uIiwgImlsbG5lc3MiLCAiaW5mZWN0aW91cyIsICJuY2QiLCAibm9uLWNvbW11bmljYWJsZV9kaXNlYXNlIiwgIm5vbmNvbW11bmljYWJsZV9kaXNlYXNlIiwgImNvbW11bmljYWJsZV9kaXNlYXNlIiwgImFpcl9wb2xsdXRpb24iLCAibnV0cml0aW9uIiwgIm1hbG51dHJpdGlvbiIsICJtZW50YWxfZGlzb3JkZXIiLCAic3R1bnRpbmciKSkpCmBgYAoKCgojIyBLV0lDCgpQZXJmb3JtaW5nIGEga2V5d29yZC1pbi1jb250ZXh0IHNlYXJjaC4gVGhlIHdpbmRvdyBpcyBzZXQgdG8gMjUgd29yZHMgYmVmb3JlIGFuZCBhZnRlciB0aGUgdGVybSAtIHJlZmxlY3RpbmcgYXBwcm94aW1hdGVseSBoYWxmIGEgcGFyYWdyYXBoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHRlcm0gKG9uIGF2ZXJhZ2UgYSBwYXJhZ3JhcGggaW4gRW5nbGlzaCBpcyA1MCB3b3JkcykuIFVOR0Qgc3BlZWNoZXMgYXJlIGhpZ2hseSBzdHJ1Y3R1cmVkIGRvY3VtZW50cyBkcmFmdGVkIG92ZXIgbG9uZyBwZXJpb2RzIG9mIHRpbWUgYW5kIHJlZmxlY3QgaW50ZXJuYWwgZGlzY3Vzc2lvbnMgYW5kIG5lZ290aWF0aW9ucyBpbiBnb3Zlcm5tZW50LiBIZW5jZSB3ZSBhc3N1bWUgdGhhdCB0ZXJtcyBhcHBlYXJpbmcgd2l0aGluIHNwZWNpZmljIHByb3hpbWl0eSBvZiBlYWNoIG90aGVyIGFyZSByZWxhdGVkIHRocm91Z2ggdGhlIHN0cnVjdHVyZWQgcHJvY2VzcyBvZiBkb2N1bWVudCBnZW5lcmF0aW9uLgoKV2Ugc2VhcmNoIGZvciB0ZXJtcyBmcm9tIG91ciBoZWFsdGggZGljdGlvbmFyeSBhbmQgc2hvdyB0aGUgMjUtd29yZCBjb250ZXh0IGFyb3VuZCB0aGVtLiAKCmBgYHtyfQp0b2suaGVhIDwtIGt3aWModG9rLmNvbXBvdW5kLCBoZWFsdGhfZGljdCwgd2luZG93ID0gMjUsIHZhbHVldHlwZSA9ICJmaXhlZCIpCgpyZWFkcjo6d3JpdGVfY3N2KHRvay5oZWEsICJoZWFsdGhfa3dpY18yNV9maXhlZC5jc3YiKQoKYGBgCgpXZSBzZWFyY2ggZm9yIHRlcm1zIGZyb20gb3VyIGNsaW1hdGUgY2hhbmdlIGRpY3Rpb25hcnkgYW5kIHNob3cgdGhlIDI1LXdvcmQgY29udGV4dCBhcm91bmQgdGhlbS4gCgpgYGB7cn0KdG9rLmNjIDwtIGt3aWModG9rLmNvbXBvdW5kLCBjbGltYXRlX2RpY3QsIHdpbmRvdyA9IDI1LCB2YWx1ZXR5cGUgPSAiZml4ZWQiKQoKcmVhZHI6OndyaXRlX2Nzdih0b2suY2MsICJjbGltYXRlX2t3aWNfMjVfZml4ZWQuY3N2IikKCmBgYAoKVG8gdGFwIGludG8gdGhlIGNvcmUgcHJvcG9zaXRpb24gb2YgdGhpcyBhbmFseXNpcyAtIHRoZSBsaW5rIGJldHdlZW4gY2xpbWF0ZSBjaGFuZ2UgYW5kIGhlYWx0aCB0ZXJtcyAtIHdlIHRha2UgdGhlIDI1LXdvcmQgY29udGV4dCBhcm91bmQgdGhlIGhlYWx0aCB0ZXJtcyBhbmQgc2VhcmNoIHRoaXMgY29udGV4dCBmb3IgY2xpbWF0ZSBjaGFuZ2UgdGVybXMuIAoKVGV4dCBzdXJyb3VuZGluZyBoZWFsdGggdGVybXMgKDI1IHdvcmRzIGVhY2ggc2lkZSkgaXMgc2F2ZWQgYW5kIHRyYW5zZm9ybWVkIHRvIGEgY29ycHVzIG9iamVjdC4gV2UgdGhlbiBwZXJmb3JtIGtleS13b3JkLWluLWNvbnRleHQgc2VhcmNoIG9mIHRoaXMgaGVhbHRoIHJlbGF0ZWQgY29ycHVzIGZvciB0aGUgdGVybXMgaW4gb3VyIGNsaW1hdGUgY2hhbmdlIGRpY3Rpb25hcnkuIAoKYGBge3J9CmNvcnB1c19oZWFsdGggPC0gY29ycHVzKHRvay5oZWEsIHNwbGl0X2NvbnRleHQgPSBGQUxTRSwgZXh0cmFjdF9rZXl3b3JkID0gVFJVRSkKCnRvay5jbGltYXRlLmt3aWMgPC0ga3dpYyhjb3JwdXNfaGVhbHRoLCBjbGltYXRlX2RpY3QsIHdpbmRvdyA9IDI1LCB2YWx1ZXR5cGUgPSAiZml4ZWQiKQoKcmVhZHI6OndyaXRlX2Nzdih0b2suY2xpbWF0ZS5rd2ljLCAiaW50ZXJzZWN0aW9uX2t3aWNfMjVfZml4ZWQuY3N2IikKCmBgYAoKCiMjIyBSb2J1c3RuZXNzIGFuYWx5c2lzCgpGb3Igcm9idXN0bmVzcyBhbmFseXNpcyB3ZSBsb29rZWQgYXQgZGlmZmVyZW50IGNvbnRleHQgd2luZG93IHNpemVzIGFuZCBtYW51YWxseSBhc3Nlc3NlZCB0aGVtIGZvciB0aGUgYmFsYW5jZSBvZiBmYWxzZSBwb3NpdGl2ZXMgdnMgZmFsc2UgbmVnYXRpdmVzLgoKYGBge3J9CnRvay5oZWEuNSA8LSBrd2ljKHRvay5jb21wb3VuZCwgaGVhbHRoX2RpY3QsIHdpbmRvdyA9IDUsIHZhbHVldHlwZSA9ICJmaXhlZCIpCnRvay5jYy41IDwtIGt3aWModG9rLmNvbXBvdW5kLCBjbGltYXRlX2RpY3QsIHdpbmRvdyA9IDUsIHZhbHVldHlwZSA9ICJmaXhlZCIpCmNvcnB1c19oZWFsdGguNSA8LSBjb3JwdXModG9rLmhlYS41LCBzcGxpdF9jb250ZXh0ID0gRkFMU0UsIGV4dHJhY3Rfa2V5d29yZCA9IFRSVUUpCnRvay5jbGltYXRlLmt3aWMuNSA8LSBrd2ljKGNvcnB1c19oZWFsdGguNSwgY2xpbWF0ZV9kaWN0LCB3aW5kb3cgPSA1LCB2YWx1ZXR5cGUgPSAiZml4ZWQiKQpyZWFkcjo6d3JpdGVfY3N2KHRvay5jbGltYXRlLmt3aWMuNSwgImludGVyc2VjdGlvbl9rd2ljXzVfZml4ZWQuY3N2IikKcmVhZHI6OndyaXRlX2Nzdih0b2suaGVhLjUsICJoZWFsdGhfa3dpY181X2ZpeGVkLmNzdiIpCnJlYWRyOjp3cml0ZV9jc3YodG9rLmNjLjUsICJjbGltYXRlX2t3aWNfNV9maXhlZC5jc3YiKQoKdG9rLmhlYS4xMCA8LSBrd2ljKHRvay5jb21wb3VuZCwgaGVhbHRoX2RpY3QsIHdpbmRvdyA9IDEwLCB2YWx1ZXR5cGUgPSAiZml4ZWQiKQp0b2suY2MuMTAgPC0ga3dpYyh0b2suY29tcG91bmQsIGNsaW1hdGVfZGljdCwgd2luZG93ID0gMTAsIHZhbHVldHlwZSA9ICJmaXhlZCIpCmNvcnB1c19oZWFsdGguMTAgPC0gY29ycHVzKHRvay5oZWEuMTAsIHNwbGl0X2NvbnRleHQgPSBGQUxTRSwgZXh0cmFjdF9rZXl3b3JkID0gVFJVRSkKdG9rLmNsaW1hdGUua3dpYy4xMCA8LSBrd2ljKGNvcnB1c19oZWFsdGguMTAsIGNsaW1hdGVfZGljdCwgd2luZG93ID0gMTAsIHZhbHVldHlwZSA9ICJmaXhlZCIpCnJlYWRyOjp3cml0ZV9jc3YodG9rLmNsaW1hdGUua3dpYy4xMCwgImludGVyc2VjdGlvbl9rd2ljXzEwX2ZpeGVkLmNzdiIpCnJlYWRyOjp3cml0ZV9jc3YodG9rLmhlYS4xMCwgImhlYWx0aF9rd2ljXzEwX2ZpeGVkLmNzdiIpCnJlYWRyOjp3cml0ZV9jc3YodG9rLmNjLjEwLCAiY2xpbWF0ZV9rd2ljXzEwX2ZpeGVkLmNzdiIpCgp0b2suaGVhLjMwIDwtIGt3aWModG9rLmNvbXBvdW5kLCBoZWFsdGhfZGljdCwgd2luZG93ID0gMzAsIHZhbHVldHlwZSA9ICJmaXhlZCIpCnRvay5jYy4zMCA8LSBrd2ljKHRvay5jb21wb3VuZCwgY2xpbWF0ZV9kaWN0LCB3aW5kb3cgPSAzMCwgdmFsdWV0eXBlID0gImZpeGVkIikKY29ycHVzX2hlYWx0aC4zMCA8LSBjb3JwdXModG9rLmhlYS4zMCwgc3BsaXRfY29udGV4dCA9IEZBTFNFLCBleHRyYWN0X2tleXdvcmQgPSBUUlVFKQp0b2suY2xpbWF0ZS5rd2ljLjMwIDwtIGt3aWMoY29ycHVzX2hlYWx0aC4zMCwgY2xpbWF0ZV9kaWN0LCB3aW5kb3cgPSAzMCwgdmFsdWV0eXBlID0gImZpeGVkIikKcmVhZHI6OndyaXRlX2Nzdih0b2suY2xpbWF0ZS5rd2ljLjMwLCAiaW50ZXJzZWN0aW9uX2t3aWNfMzBfZml4ZWQuY3N2IikKcmVhZHI6OndyaXRlX2Nzdih0b2suaGVhLjMwLCAiaGVhbHRoX2t3aWNfMzBfZml4ZWQuY3N2IikKcmVhZHI6OndyaXRlX2Nzdih0b2suY2MuMzAsICJjbGltYXRlX2t3aWNfMzBfZml4ZWQuY3N2IikKCnRvay5oZWEuNTAgPC0ga3dpYyh0b2suY29tcG91bmQsIGhlYWx0aF9kaWN0LCB3aW5kb3cgPSA1MCwgdmFsdWV0eXBlID0gImZpeGVkIikKdG9rLmNjLjUwIDwtIGt3aWModG9rLmNvbXBvdW5kLCBjbGltYXRlX2RpY3QsIHdpbmRvdyA9IDUwLCB2YWx1ZXR5cGUgPSAiZml4ZWQiKQpjb3JwdXNfaGVhbHRoLjUwIDwtIGNvcnB1cyh0b2suaGVhLjUwLCBzcGxpdF9jb250ZXh0ID0gRkFMU0UsIGV4dHJhY3Rfa2V5d29yZCA9IFRSVUUpCnRvay5jbGltYXRlLmt3aWMuNTAgPC0ga3dpYyhjb3JwdXNfaGVhbHRoLjUwLCBjbGltYXRlX2RpY3QsIHdpbmRvdyA9IDUwLCB2YWx1ZXR5cGUgPSAiZml4ZWQiKQpyZWFkcjo6d3JpdGVfY3N2KHRvay5jbGltYXRlLmt3aWMuNTAsICJpbnRlcnNlY3Rpb25fa3dpY181MF9maXhlZC5jc3YiKQpyZWFkcjo6d3JpdGVfY3N2KHRvay5oZWEuNTAsICJoZWFsdGhfa3dpY181MF9maXhlZC5jc3YiKQpyZWFkcjo6d3JpdGVfY3N2KHRvay5jYy41MCwgImNsaW1hdGVfa3dpY181MF9maXhlZC5jc3YiKQoKYGBgCgoKCgoKYGBge3J9CmhlYWx0aF9kZm0gPC0gZGZtKGNvcnB1c19oZWFsdGgpCgpjb3JwdXNfY2xpbWF0ZSA8LSBjb3JwdXModG9rLmNjLCBzcGxpdF9jb250ZXh0ID0gRkFMU0UsIGV4dHJhY3Rfa2V5d29yZCA9IFRSVUUpCmNsaW1hdGVfZGZtIDwtIGRmbShjb3JwdXNfY2xpbWF0ZSkKCmNvcnB1c19pbnRlcnNlY3Rpb24gPC0gY29ycHVzKHRvay5jbGltYXRlLmt3aWMsIHNwbGl0X2NvbnRleHQgPSBGQUxTRSwgZXh0cmFjdF9rZXl3b3JkID0gVFJVRSkKaW50ZXJzZWN0aW9uX2RmbSA8LSBkZm0oY29ycHVzX2ludGVyc2VjdGlvbikKCmhlYWx0aCA8LSBjb252ZXJ0KGhlYWx0aF9kZm0sICJkYXRhLmZyYW1lIikKY2xpbWF0ZSA8LSBjb252ZXJ0KGNsaW1hdGVfZGZtLCAiZGF0YS5mcmFtZSIpCmludGVyc2VjdGlvbiA8LSBjb252ZXJ0KGludGVyc2VjdGlvbl9kZm0sICJkYXRhLmZyYW1lIikKCm5hbWVzKGhlYWx0aClbMV0gPC0gImRvY2lkIgpuYW1lcyhjbGltYXRlKVsxXSA8LSAiZG9jaWQiCm5hbWVzKGludGVyc2VjdGlvbilbMV0gPC0gImRvY2lkIgoKaGVhbHRoJCJkb2NpZCIgPC0gc3RyX2V4dHJhY3QoaGVhbHRoJGRvY2lkLCAiXihbXi5dKykiKQpjbGltYXRlJCJkb2NpZCIgPC0gc3RyX2V4dHJhY3QoY2xpbWF0ZSRkb2NpZCwgIl4oW14uXSspIikKaW50ZXJzZWN0aW9uJCJkb2NpZCIgPC0gc3RyX2V4dHJhY3QoaW50ZXJzZWN0aW9uJGRvY2lkLCAiXihbXi5dKykiKQoKaGVhbHRoX2NvdW50cyA8LSBoZWFsdGggJT4lIGdyb3VwX2J5KGRvY2lkKSAlPiUgc3VtbWFyaXNlKGhlYWx0aF9jb3VudCA9IG4oKSkKY2xpbWF0ZV9jb3VudHMgPC0gY2xpbWF0ZSAlPiUgZ3JvdXBfYnkoZG9jaWQpICU+JSBzdW1tYXJpc2UoY2xpbWF0ZV9jb3VudCA9IG4oKSkKaW50ZXJzZWN0aW9uX2NvdW50cyA8LSBpbnRlcnNlY3Rpb24gJT4lIGdyb3VwX2J5KGRvY2lkKSAlPiUgc3VtbWFyaXNlKGludGVyc2VjdGlvbl9jb3VudCA9IG4oKSkKCnRvdGFsX2NvdW50cyA8LSBjbGltYXRlX2NvdW50cyAlPiUgCiAgZnVsbF9qb2luKGhlYWx0aF9jb3VudHMsIGJ5ID0gImRvY2lkIikgJT4lIAogIGZ1bGxfam9pbihpbnRlcnNlY3Rpb25fY291bnRzLCBieSA9ICJkb2NpZCIpICU+JQogIHJlcGxhY2VfbmEobGlzdChoZWFsdGhfY291bnQ9MCwgY2xpbWF0ZV9jb3VudD0wLCBpbnRlcnNlY3Rpb25fY291bnQ9MCkpICU+JQogIHNlcGFyYXRlKGRvY2lkLCBjKCJjb3VudHJ5IiwgInllYXIiKSwgIl8iKQoKdG90YWxfY291bnRzJHllYXIgPC0gYXMubnVtZXJpYyh0b3RhbF9jb3VudHMkeWVhcikKCnRvdGFsX2NvdW50cyA8LSBhcnJhbmdlKHRvdGFsX2NvdW50cywgY291bnRyeSwgeWVhcikKCmBgYAoKCmBgYHtyfQpyZWFkcjo6d3JpdGVfY3N2KHRvdGFsX2NvdW50cywgInRvdGFsX2NvdW50cy5jc3YiKQpgYGAKCgoKCgojIE1hcHMgb2YgbWVudGlvbiBjb3VudHMKCgojIyBNYXAgZm9yIDIwMTggb2YgUEggYW5kIENDCgpLZWVwaW5nIG9ubHkgY291bnRyeS15ZWFycyB3aXRoIGF0IGxlYXN0IG9uZSBtZW50aW9uIG9mIENDIGluIFBIIGNvbmV4dAoKCmBgYHtyfQoKbWFwIDwtIGpvaW5Db3VudHJ5RGF0YTJNYXAoc3Vic2V0KHRvdGFsX2NvdW50cywgeWVhcj09MjAxOCAmIGhlYWx0aF9jb3VudD4wKSwgam9pbkNvZGU9IklTTzMiLCBuYW1lSm9pbkNvbHVtbj0iY291bnRyeSIpCgpuZXdfd29ybGQgPC0gc3Vic2V0KG1hcCwgY29udGluZW50ICE9ICJBbnRhcmN0aWNhIikKCnBkZigid29ybGRtYXBfMjAxOF9oZWFsdGgucGRmIiwgd2lkdGggPSA3LCBoZWlnaHQgPSAzKQoKcGFyKG1haT1jKDAsMCwwLjIsMCkseGF4cz0iaSIseWF4cz0iaSIpCgptYXBQYXJhbXMgPC0gbWFwQ291bnRyeURhdGEobmV3X3dvcmxkLCBuYW1lQ29sdW1uVG9QbG90PSJoZWFsdGhfY291bnQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFRpdGxlPSIyMDE4IFVOIEdlbmVyYWwgRGViYXRlOiBIZWFsdGgiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdE1ldGhvZCA9ICJjYXRlZ29yaWNhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyUGFsZXR0ZSA9ICJoZWF0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY2VhbkNvbCA9ICJsaWdodGJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmdDb3VudHJ5Q29sID0gIndoaXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMZWdlbmQ9IkZBTFNFIikKCmRvLmNhbGwoIGFkZE1hcExlZ2VuZEJveGVzLCBjKG1hcFBhcmFtcyx0aXRsZT0iTnVtYmVyIG9mIG1lbnRpb25zIix4ID0gImJvdHRvbSIsIGhvcml6PVRSVUUsIGNleD0wLjUpKQoKZGV2Lm9mZigpCmBgYAoKCmBgYHtyfQoKbWFwIDwtIGpvaW5Db3VudHJ5RGF0YTJNYXAoc3Vic2V0KHRvdGFsX2NvdW50cywgeWVhcj09MjAxOCAmIGNsaW1hdGVfY291bnQ+MCksIGpvaW5Db2RlPSJJU08zIiwgbmFtZUpvaW5Db2x1bW49ImNvdW50cnkiKQoKbmV3X3dvcmxkIDwtIHN1YnNldChtYXAsIGNvbnRpbmVudCAhPSAiQW50YXJjdGljYSIpCgpwZGYoIndvcmxkbWFwXzIwMThfY2xpbWF0ZS5wZGYiLCB3aWR0aCA9IDcsIGhlaWdodCA9IDMpCgpwYXIobWFpPWMoMCwwLDAuMiwwKSx4YXhzPSJpIix5YXhzPSJpIikKCm1hcFBhcmFtcyA8LSBtYXBDb3VudHJ5RGF0YShuZXdfd29ybGQsIG5hbWVDb2x1bW5Ub1Bsb3Q9ImNsaW1hdGVfY291bnQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFRpdGxlPSIyMDE4IFVOIEdlbmVyYWwgRGViYXRlOiBDbGltYXRlIENoYW5nZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0TWV0aG9kID0gImNhdGVnb3JpY2FsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXJQYWxldHRlID0gImhlYXQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jZWFuQ29sID0gImxpZ2h0Ymx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZ0NvdW50cnlDb2wgPSAid2hpdGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExlZ2VuZD0iRkFMU0UiKQoKZG8uY2FsbCggYWRkTWFwTGVnZW5kQm94ZXMsIGMobWFwUGFyYW1zLHRpdGxlPSJOdW1iZXIgb2YgbWVudGlvbnMiLHggPSAiYm90dG9tIiwgaG9yaXo9VFJVRSwgY2V4PTAuNSkpCgpkZXYub2ZmKCkKYGBgCgoKYGBge3J9CgptYXAgPC0gam9pbkNvdW50cnlEYXRhMk1hcChzdWJzZXQodG90YWxfY291bnRzLCB5ZWFyPT0yMDE4ICYgaW50ZXJzZWN0aW9uX2NvdW50PjApLCBqb2luQ29kZT0iSVNPMyIsIG5hbWVKb2luQ29sdW1uPSJjb3VudHJ5IikKCm5ld193b3JsZCA8LSBzdWJzZXQobWFwLCBjb250aW5lbnQgIT0gIkFudGFyY3RpY2EiKQoKcGRmKCJ3b3JsZG1hcF8yMDE4X2ludGVyc2VjdGlvbi5wZGYiLCB3aWR0aCA9IDcsIGhlaWdodCA9IDMpCgpwYXIobWFpPWMoMCwwLDAuMiwwKSx4YXhzPSJpIix5YXhzPSJpIikKCm1hcFBhcmFtcyA8LSBtYXBDb3VudHJ5RGF0YShuZXdfd29ybGQsIG5hbWVDb2x1bW5Ub1Bsb3Q9ImludGVyc2VjdGlvbl9jb3VudCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwVGl0bGU9IjIwMTggVU4gR2VuZXJhbCBEZWJhdGU6IEludGVyc2VjdGlvbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0TWV0aG9kID0gImNhdGVnb3JpY2FsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXJQYWxldHRlID0gImhlYXQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jZWFuQ29sID0gImxpZ2h0Ymx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZ0NvdW50cnlDb2wgPSAid2hpdGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExlZ2VuZD0iRkFMU0UiKQoKZG8uY2FsbCggYWRkTWFwTGVnZW5kQm94ZXMsIGMobWFwUGFyYW1zLHRpdGxlPSJOdW1iZXIgb2YgbWVudGlvbnMiLHggPSAiYm90dG9tIiwgaG9yaXo9VFJVRSwgY2V4PTAuNSkpCgpkZXYub2ZmKCkKYGBgCgoKIyBDb3VudHJ5IHBsb3RzCgojI1VTQQoKYGBge3J9Cgp0b3RhbF9jb3VudHMgPC0gdG90YWxfY291bnRzICU+JSBhZGRfcm93KGNvdW50cnkgPSAiVVNBIiwgeWVhciA9IDIwMTgsIGNsaW1hdGVfY291bnQgPSAwLCBoZWFsdGhfY291bnQgPSAwLCBpbnRlcnNlY3Rpb25fY291bnQgID0gIDApCgoKZ2dwbG90KHN1YnNldCh0b3RhbF9jb3VudHMsIGNvdW50cnk9PSJVU0EiKSwgYWVzKHg9eWVhcikpICsKICB0aGVtZV9idygpICsKICBnZW9tX2xpbmUoYWVzKHk9IGhlYWx0aF9jb3VudCksIGNvbG91ciA9ICJibHVlIiwgYWxwaGEgPSAwLjksIGxpbmV0eXBlPSJkb3RkYXNoIikgKwogIGdlb21fbGluZShhZXMoeT0gY2xpbWF0ZV9jb3VudCksIGNvbG91ciA9ICJkYXJrZ3JlZW4iLCBhbHBoYSA9IDAuOSwgbGluZXR5cGU9ImRhc2hlZCIpICsKICBnZW9tX2xpbmUoYWVzKHk9IGludGVyc2VjdGlvbl9jb3VudCksIGNvbG91ciA9ICJyZWQiLCBhbHBoYSA9IDAuOSkgKwogIGdndGl0bGUoIlVTQSIpICsgCiAgeWxhYigiVG90YWwgbnVtYmVyIG9mIHJlZmVyZW5jZXMgcGVyIFVOR0Qgc2Vzc2lvbiIpICsgeGxhYigiWWVhciIpICsgCiMgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCAxNDApLCBicmVha3MgPSBjKDEsIDUwLCAxMDAsIDEzNCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOCksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOCkpCgpnZ3NhdmUoInRpbWVzZXJpZXNfYWxsX3RvdGFsX2NvdW50X1VTQS5wZGYiKQpgYGAKCgoKIyNHQlIKCmBgYHtyfQoKdG90YWxfY291bnRzIDwtIHRvdGFsX2NvdW50cyAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkdCUiIsIHllYXIgPSAxOTcwLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkdCUiIsIHllYXIgPSAxOTcxLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKQoKZ2dwbG90KHN1YnNldCh0b3RhbF9jb3VudHMsIGNvdW50cnk9PSJHQlIiKSwgYWVzKHg9eWVhcikpICsKICB0aGVtZV9idygpICsKICBnZW9tX2xpbmUoYWVzKHk9IGhlYWx0aF9jb3VudCksIGNvbG91ciA9ICJibHVlIiwgYWxwaGEgPSAwLjksIGxpbmV0eXBlPSJkb3RkYXNoIikgKwogIGdlb21fbGluZShhZXMoeT0gY2xpbWF0ZV9jb3VudCksIGNvbG91ciA9ICJkYXJrZ3JlZW4iLCBhbHBoYSA9IDAuOSwgbGluZXR5cGU9ImRhc2hlZCIpICsKICBnZW9tX2xpbmUoYWVzKHk9IGludGVyc2VjdGlvbl9jb3VudCksIGNvbG91ciA9ICJyZWQiLCBhbHBoYSA9IDAuOSkgKwogIGdndGl0bGUoIlVLIikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKyAKIyAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsIDE0MCksIGJyZWFrcyA9IGMoMSwgNTAsIDEwMCwgMTM0KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE4KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE4KSkKCmdnc2F2ZSgidGltZXNlcmllc19hbGxfdG90YWxfY291bnRfR0JSLnBkZiIpCmBgYAoKIyNHZXJtYW55CmBgYHtyfQoKdG90YWxfY291bnRzIDwtIHRvdGFsX2NvdW50cyAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkRFVSIsIHllYXIgPSAxOTcwLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkRFVSIsIHllYXIgPSAxOTcxLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkRFVSIsIHllYXIgPSAxOTcyLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkRFVSIsIHllYXIgPSAxOTczLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkRFVSIsIHllYXIgPSAxOTc0LCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkRFVSIsIHllYXIgPSAxOTc1LCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkRFVSIsIHllYXIgPSAxOTc2LCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkRFVSIsIHllYXIgPSAxOTc3LCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKQoKCmdncGxvdChzdWJzZXQodG90YWxfY291bnRzLCBjb3VudHJ5PT0iREVVIiksIGFlcyh4PXllYXIpKSArCiAgdGhlbWVfYncoKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBoZWFsdGhfY291bnQpLCBjb2xvdXIgPSAiYmx1ZSIsIGFscGhhID0gMC45LCBsaW5ldHlwZT0iZG90ZGFzaCIpICsKICBnZW9tX2xpbmUoYWVzKHk9IGNsaW1hdGVfY291bnQpLCBjb2xvdXIgPSAiZGFya2dyZWVuIiwgYWxwaGEgPSAwLjksIGxpbmV0eXBlPSJkYXNoZWQiKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBpbnRlcnNlY3Rpb25fY291bnQpLCBjb2xvdXIgPSAicmVkIiwgYWxwaGEgPSAwLjkpICsKICBnZ3RpdGxlKCJHZXJtYW55IikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKyAKIyAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsIDE0MCksIGJyZWFrcyA9IGMoMSwgNTAsIDEwMCwgMTM0KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE4KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE4KSkKCmdnc2F2ZSgidGltZXNlcmllc19hbGxfdG90YWxfY291bnRfREVVLnBkZiIpCmBgYAoKCgojI0ZyYW5jZQpgYGB7cn0KZ2dwbG90KHN1YnNldCh0b3RhbF9jb3VudHMsIGNvdW50cnk9PSJGUkEiKSwgYWVzKHg9eWVhcikpICsKICB0aGVtZV9idygpICsKICBnZW9tX2xpbmUoYWVzKHk9IGhlYWx0aF9jb3VudCksIGNvbG91ciA9ICJibHVlIiwgYWxwaGEgPSAwLjksIGxpbmV0eXBlPSJkb3RkYXNoIikgKwogIGdlb21fbGluZShhZXMoeT0gY2xpbWF0ZV9jb3VudCksIGNvbG91ciA9ICJkYXJrZ3JlZW4iLCBhbHBoYSA9IDAuOSwgbGluZXR5cGU9ImRhc2hlZCIpICsKICBnZW9tX2xpbmUoYWVzKHk9IGludGVyc2VjdGlvbl9jb3VudCksIGNvbG91ciA9ICJyZWQiLCBhbHBoYSA9IDAuOSkgKwogIGdndGl0bGUoIkZyYW5jZSIpICsgCiAgeWxhYigiVG90YWwgbnVtYmVyIG9mIHJlZmVyZW5jZXMgcGVyIFVOR0Qgc2Vzc2lvbiIpICsgeGxhYigiWWVhciIpICsgCiMgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCAxNDApLCBicmVha3MgPSBjKDEsIDUwLCAxMDAsIDEzNCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOCksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOCkpCgpnZ3NhdmUoInRpbWVzZXJpZXNfYWxsX3RvdGFsX2NvdW50X0ZSQS5wZGYiKQpgYGAKCgojI0NoaW5hCmBgYHtyfQp0b3RhbF9jb3VudHMgPC0gdG90YWxfY291bnRzICU+JSBhZGRfcm93KGNvdW50cnkgPSAiQ0hOIiwgeWVhciA9IDE5NzEsIGNsaW1hdGVfY291bnQgPSAwLCBoZWFsdGhfY291bnQgPSAwLCBpbnRlcnNlY3Rpb25fY291bnQgID0gIDApIAoKZ2dwbG90KHN1YnNldCh0b3RhbF9jb3VudHMsIGNvdW50cnk9PSJDSE4iKSwgYWVzKHg9eWVhcikpICsKICB0aGVtZV9idygpICsKICBnZW9tX2xpbmUoYWVzKHk9IGhlYWx0aF9jb3VudCksIGNvbG91ciA9ICJibHVlIiwgYWxwaGEgPSAwLjksIGxpbmV0eXBlPSJkb3RkYXNoIikgKwogIGdlb21fbGluZShhZXMoeT0gY2xpbWF0ZV9jb3VudCksIGNvbG91ciA9ICJkYXJrZ3JlZW4iLCBhbHBoYSA9IDAuOSwgbGluZXR5cGU9ImRhc2hlZCIpICsKICBnZW9tX2xpbmUoYWVzKHk9IGludGVyc2VjdGlvbl9jb3VudCksIGNvbG91ciA9ICJyZWQiLCBhbHBoYSA9IDAuOSkgKwogIGdndGl0bGUoIkNoaW5hIikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKyAKIyAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsIDE0MCksIGJyZWFrcyA9IGMoMSwgNTAsIDEwMCwgMTM0KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE4KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE4KSkKCmdnc2F2ZSgidGltZXNlcmllc19hbGxfdG90YWxfY291bnRfQ0hOLnBkZiIpCmBgYAoKCiMjTm9yd2F5CmBgYHtyfQp0b3RhbF9jb3VudHMgPC0gdG90YWxfY291bnRzICU+JSBhZGRfcm93KGNvdW50cnkgPSAiTk9SIiwgeWVhciA9IDE5NzAsIGNsaW1hdGVfY291bnQgPSAwLCBoZWFsdGhfY291bnQgPSAwLCBpbnRlcnNlY3Rpb25fY291bnQgID0gIDApICU+JSBhZGRfcm93KGNvdW50cnkgPSAiTk9SIiwgeWVhciA9IDE5NzEsIGNsaW1hdGVfY291bnQgPSAwLCBoZWFsdGhfY291bnQgPSAwLCBpbnRlcnNlY3Rpb25fY291bnQgID0gIDApICU+JSBhZGRfcm93KGNvdW50cnkgPSAiTk9SIiwgeWVhciA9IDE5NzIsIGNsaW1hdGVfY291bnQgPSAwLCBoZWFsdGhfY291bnQgPSAwLCBpbnRlcnNlY3Rpb25fY291bnQgID0gIDApCgpnZ3Bsb3Qoc3Vic2V0KHRvdGFsX2NvdW50cywgY291bnRyeT09Ik5PUiIpLCBhZXMoeD15ZWFyKSkgKwogIHRoZW1lX2J3KCkgKwogIGdlb21fbGluZShhZXMoeT0gaGVhbHRoX2NvdW50KSwgY29sb3VyID0gImJsdWUiLCBhbHBoYSA9IDAuOSwgbGluZXR5cGU9ImRvdGRhc2giKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBjbGltYXRlX2NvdW50KSwgY29sb3VyID0gImRhcmtncmVlbiIsIGFscGhhID0gMC45LCBsaW5ldHlwZT0iZGFzaGVkIikgKwogIGdlb21fbGluZShhZXMoeT0gaW50ZXJzZWN0aW9uX2NvdW50KSwgY29sb3VyID0gInJlZCIsIGFscGhhID0gMC45KSArCiAgZ2d0aXRsZSgiTm9yd2F5IikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKyAKIyAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsIDE0MCksIGJyZWFrcyA9IGMoMSwgNTAsIDEwMCwgMTM0KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE4KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE4KSkKCmdnc2F2ZSgidGltZXNlcmllc19hbGxfdG90YWxfY291bnRfTk9SLnBkZiIpCmBgYAoKCiMjQXVzdHJhbGlhCmBgYHtyfQp0b3RhbF9jb3VudHMgPC0gdG90YWxfY291bnRzICU+JSBhZGRfcm93KGNvdW50cnkgPSAiQVVTIiwgeWVhciA9IDE5NzAsIGNsaW1hdGVfY291bnQgPSAwLCBoZWFsdGhfY291bnQgPSAwLCBpbnRlcnNlY3Rpb25fY291bnQgID0gIDApCgpnZ3Bsb3Qoc3Vic2V0KHRvdGFsX2NvdW50cywgY291bnRyeT09IkFVUyIpLCBhZXMoeD15ZWFyKSkgKwogIHRoZW1lX2J3KCkgKwogIGdlb21fbGluZShhZXMoeT0gaGVhbHRoX2NvdW50KSwgY29sb3VyID0gImJsdWUiLCBhbHBoYSA9IDAuOSwgbGluZXR5cGU9ImRvdGRhc2giKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBjbGltYXRlX2NvdW50KSwgY29sb3VyID0gImRhcmtncmVlbiIsIGFscGhhID0gMC45LCBsaW5ldHlwZT0iZGFzaGVkIikgKwogIGdlb21fbGluZShhZXMoeT0gaW50ZXJzZWN0aW9uX2NvdW50KSwgY29sb3VyID0gInJlZCIsIGFscGhhID0gMC45KSArCiAgZ2d0aXRsZSgiQXVzdHJhbGlhIikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKyAKIyAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsIDE0MCksIGJyZWFrcyA9IGMoMSwgNTAsIDEwMCwgMTM0KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE4KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE4KSkKCmdnc2F2ZSgidGltZXNlcmllc19hbGxfdG90YWxfY291bnRfQVVTLnBkZiIpCmBgYAoKCiMjSW5kaWEKYGBge3J9CnRvdGFsX2NvdW50cyA8LSB0b3RhbF9jb3VudHMgJT4lIGFkZF9yb3coY291bnRyeSA9ICJJTkQiLCB5ZWFyID0gMTk3MCwgY2xpbWF0ZV9jb3VudCA9IDAsIGhlYWx0aF9jb3VudCA9IDAsIGludGVyc2VjdGlvbl9jb3VudCAgPSAgMCkgJT4lIGFkZF9yb3coY291bnRyeSA9ICJJTkQiLCB5ZWFyID0gMTk3MSwgY2xpbWF0ZV9jb3VudCA9IDAsIGhlYWx0aF9jb3VudCA9IDAsIGludGVyc2VjdGlvbl9jb3VudCAgPSAgMCkKCmdncGxvdChzdWJzZXQodG90YWxfY291bnRzLCBjb3VudHJ5PT0iSU5EIiksIGFlcyh4PXllYXIpKSArCiAgdGhlbWVfYncoKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBoZWFsdGhfY291bnQpLCBjb2xvdXIgPSAiYmx1ZSIsIGFscGhhID0gMC45LCBsaW5ldHlwZT0iZG90ZGFzaCIpICsKICBnZW9tX2xpbmUoYWVzKHk9IGNsaW1hdGVfY291bnQpLCBjb2xvdXIgPSAiZGFya2dyZWVuIiwgYWxwaGEgPSAwLjksIGxpbmV0eXBlPSJkYXNoZWQiKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBpbnRlcnNlY3Rpb25fY291bnQpLCBjb2xvdXIgPSAicmVkIiwgYWxwaGEgPSAwLjkpICsKICBnZ3RpdGxlKCJJbmRpYSIpICsgCiAgeWxhYigiVG90YWwgbnVtYmVyIG9mIHJlZmVyZW5jZXMgcGVyIFVOR0Qgc2Vzc2lvbiIpICsgeGxhYigiWWVhciIpICsgCiMgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCAxNDApLCBicmVha3MgPSBjKDEsIDUwLCAxMDAsIDEzNCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOCksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOCkpCgpnZ3NhdmUoInRpbWVzZXJpZXNfYWxsX3RvdGFsX2NvdW50X0lORC5wZGYiKQpgYGAKCgojI0JlbGdpdW0KYGBge3J9CnRvdGFsX2NvdW50cyA8LSB0b3RhbF9jb3VudHMgJT4lIGFkZF9yb3coY291bnRyeSA9ICJCRUwiLCB5ZWFyID0gMTk3MCwgY2xpbWF0ZV9jb3VudCA9IDAsIGhlYWx0aF9jb3VudCA9IDAsIGludGVyc2VjdGlvbl9jb3VudCAgPSAgMCkgJT4lIGFkZF9yb3coY291bnRyeSA9ICJCRUwiLCB5ZWFyID0gMTk3MSwgY2xpbWF0ZV9jb3VudCA9IDAsIGhlYWx0aF9jb3VudCA9IDAsIGludGVyc2VjdGlvbl9jb3VudCAgPSAgMCkgJT4lIGFkZF9yb3coY291bnRyeSA9ICJCRUwiLCB5ZWFyID0gMTk3MiwgY2xpbWF0ZV9jb3VudCA9IDAsIGhlYWx0aF9jb3VudCA9IDAsIGludGVyc2VjdGlvbl9jb3VudCAgPSAgMCkgJT4lIGFkZF9yb3coY291bnRyeSA9ICJCRUwiLCB5ZWFyID0gMTk3MywgY2xpbWF0ZV9jb3VudCA9IDAsIGhlYWx0aF9jb3VudCA9IDAsIGludGVyc2VjdGlvbl9jb3VudCAgPSAgMCkgJT4lIGFkZF9yb3coY291bnRyeSA9ICJCRUwiLCB5ZWFyID0gMTk3NCwgY2xpbWF0ZV9jb3VudCA9IDAsIGhlYWx0aF9jb3VudCA9IDAsIGludGVyc2VjdGlvbl9jb3VudCAgPSAgMCkgCgpnZ3Bsb3Qoc3Vic2V0KHRvdGFsX2NvdW50cywgY291bnRyeT09IkJFTCIpLCBhZXMoeD15ZWFyKSkgKwogIHRoZW1lX2J3KCkgKwogIGdlb21fbGluZShhZXMoeT0gaGVhbHRoX2NvdW50KSwgY29sb3VyID0gImJsdWUiLCBhbHBoYSA9IDAuOSwgbGluZXR5cGU9ImRvdGRhc2giKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBjbGltYXRlX2NvdW50KSwgY29sb3VyID0gImRhcmtncmVlbiIsIGFscGhhID0gMC45LCBsaW5ldHlwZT0iZGFzaGVkIikgKwogIGdlb21fbGluZShhZXMoeT0gaW50ZXJzZWN0aW9uX2NvdW50KSwgY29sb3VyID0gInJlZCIsIGFscGhhID0gMC45KSArCiAgZ2d0aXRsZSgiQmVsZ2l1bSIpICsgCiAgeWxhYigiVG90YWwgbnVtYmVyIG9mIHJlZmVyZW5jZXMgcGVyIFVOR0Qgc2Vzc2lvbiIpICsgeGxhYigiWWVhciIpICsgCiMgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCAxNDApLCBicmVha3MgPSBjKDEsIDUwLCAxMDAsIDEzNCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOCksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOCkpCgpnZ3NhdmUoInRpbWVzZXJpZXNfYWxsX3RvdGFsX2NvdW50X0JFTC5wZGYiKQpgYGAKCgojI0phcGFuCmBgYHtyfQoKdG90YWxfY291bnRzIDwtIHRvdGFsX2NvdW50cyAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkpQTiIsIHllYXIgPSAxOTcwLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkpQTiIsIHllYXIgPSAxOTcxLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkpQTiIsIHllYXIgPSAxOTcyLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkpQTiIsIHllYXIgPSAxOTczLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkpQTiIsIHllYXIgPSAxOTc0LCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkpQTiIsIHllYXIgPSAxOTc1LCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkpQTiIsIHllYXIgPSAxOTc2LCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkpQTiIsIHllYXIgPSAxOTc3LCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAKCmdncGxvdChzdWJzZXQodG90YWxfY291bnRzLCBjb3VudHJ5PT0iSlBOIiksIGFlcyh4PXllYXIpKSArCiAgdGhlbWVfYncoKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBoZWFsdGhfY291bnQpLCBjb2xvdXIgPSAiYmx1ZSIsIGFscGhhID0gMC45LCBsaW5ldHlwZT0iZG90ZGFzaCIpICsKICBnZW9tX2xpbmUoYWVzKHk9IGNsaW1hdGVfY291bnQpLCBjb2xvdXIgPSAiZGFya2dyZWVuIiwgYWxwaGEgPSAwLjksIGxpbmV0eXBlPSJkYXNoZWQiKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBpbnRlcnNlY3Rpb25fY291bnQpLCBjb2xvdXIgPSAicmVkIiwgYWxwaGEgPSAwLjkpICsKICBnZ3RpdGxlKCJKYXBhbiIpICsgCiAgeWxhYigiVG90YWwgbnVtYmVyIG9mIHJlZmVyZW5jZXMgcGVyIFVOR0Qgc2Vzc2lvbiIpICsgeGxhYigiWWVhciIpICsgCiMgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCAxNDApLCBicmVha3MgPSBjKDEsIDUwLCAxMDAsIDEzNCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOCksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOCkpCgpnZ3NhdmUoInRpbWVzZXJpZXNfYWxsX3RvdGFsX2NvdW50X0pQTi5wZGYiKQpgYGAKCiNFVQoKYGBge3J9CiNldSBwcmVzaWRlbmNpZXMKCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdCA8LSB0b3RhbF9jb3VudHMkY291bnRyeQoKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkJFTCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTcwXSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJJVEEiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk3MV0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiTkxEIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5NzJdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkROSyIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTczXSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJGUkEiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk3NF0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiSVRBIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5NzVdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIk5MRCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTc2XSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJCRUwiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk3N10gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiREVVIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5NzhdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIklSTCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTc5XSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJMVVgiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk4MF0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiR0JSIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5ODFdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkROSyIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTgyXSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJHUkMiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk4M10gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiSVJMIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5ODRdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkxVWCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTg1XSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJHQlIiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk4Nl0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiRE5LIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5ODddIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkdSQyIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTg4XSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJGUkEiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk4OV0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiSVRBIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5OTBdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIk5MRCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTkxXSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJHQlIiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk5Ml0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiQkVMIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5OTNdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkRFVSIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTk0XSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJFU1AiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk5NV0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiSVJMIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5OTZdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkxVWCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTk3XSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJBVVQiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk5OF0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiRklOIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5OTldIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkZSQSIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAyMDAwXSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJCRUwiICYgdG90YWxfY291bnRzJHllYXIgPT0gMjAwMV0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiRE5LIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDIwMDJdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIklUQSIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAyMDAzXSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJOTEQiICYgdG90YWxfY291bnRzJHllYXIgPT0gMjAwNF0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiR0JSIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDIwMDVdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkZJTiIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAyMDA2XSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJQUlQiICYgdG90YWxfY291bnRzJHllYXIgPT0gMjAwN10gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiRlJBIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDIwMDhdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIlNXRSIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAyMDA5XSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJCRUwiICYgdG90YWxfY291bnRzJHllYXIgPT0gMjAxMF0gPC0gIkVVIgoKCmBgYAoKCgpgYGB7cn0KCnRvdGFsX2NvdW50cyA8LSB0b3RhbF9jb3VudHMgJT4lIGFkZF9yb3coY291bnRyeV9hbHQgPSAiRVUiLCB5ZWFyID0gMTk3MCwgY2xpbWF0ZV9jb3VudCA9IDAsIGhlYWx0aF9jb3VudCA9IDAsIGludGVyc2VjdGlvbl9jb3VudCAgPSAgMCkgJT4lICBhZGRfcm93KGNvdW50cnlfYWx0ID0gIkVVIiwgeWVhciA9IDE5NzEsIGNsaW1hdGVfY291bnQgPSAwLCBoZWFsdGhfY291bnQgPSAwLCBpbnRlcnNlY3Rpb25fY291bnQgID0gIDApCgpnZ3Bsb3Qoc3Vic2V0KHRvdGFsX2NvdW50cywgY291bnRyeV9hbHQ9PSJFVSIpLCBhZXMoeD15ZWFyKSkgKwogIHRoZW1lX2J3KCkgKwogIGdlb21fbGluZShhZXMoeT0gaGVhbHRoX2NvdW50KSwgY29sb3VyID0gImJsdWUiLCBhbHBoYSA9IDAuOSwgbGluZXR5cGU9ImRvdGRhc2giKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBjbGltYXRlX2NvdW50KSwgY29sb3VyID0gImRhcmtncmVlbiIsIGFscGhhID0gMC45LCBsaW5ldHlwZT0iZGFzaGVkIikgKwogIGdlb21fbGluZShhZXMoeT0gaW50ZXJzZWN0aW9uX2NvdW50KSwgY29sb3VyID0gInJlZCIsIGFscGhhID0gMC45KSArCiAgZ2d0aXRsZSgiRVUiKSArIAogIHlsYWIoIlRvdGFsIG51bWJlciBvZiByZWZlcmVuY2VzIHBlciBVTkdEIHNlc3Npb24iKSArIHhsYWIoIlllYXIiKSArIAojICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwgMTQwKSwgYnJlYWtzID0gYygxLCA1MCwgMTAwLCAxMzQpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDE5NzAsIDIwMTgpLCBicmVha3MgPSBjKDE5NzAsIDE5ODAsIDE5OTAsIDIwMDAsIDIwMTAsIDIwMTgpKQoKZ2dzYXZlKCJ0aW1lc2VyaWVzX2FsbF90b3RhbF9jb3VudF9FVS5wZGYiKQpgYGAKCgoKIyBUaW1lIHNlcmllcyBvZiB0b3RhbCBjb3VudHMgcGxvdAoKIyMgdG90YWwgY291bnRzCgoKYGBge3J9CiMgY2FsY3VsYXRpbmcgdGhlIHRvdGFsIG51bWJlciBvZiBtZW50aW9ucyBieSB5ZWFyCnN1bSA8LSBzdW1tYXJpc2UoZ3JvdXBfYnkodG90YWxfY291bnRzLCB5ZWFyKSwgCiAgICAgICAgICAgICAgICAgc3VtX0NDID0gc3VtKGNsaW1hdGVfY291bnQpLCBzdW1fUEggPSBzdW0oaGVhbHRoX2NvdW50KSwgc3VtX2ludCA9IHN1bShpbnRlcnNlY3Rpb25fY291bnQpLAogICAgICAgICAgICAgICAgIG1lYW5fQ0MgPSBtZWFuKGNsaW1hdGVfY291bnQpLCBtZWFuX1BIID0gbWVhbihoZWFsdGhfY291bnQpLCBtZWFuX2ludCA9IG1lYW4oaW50ZXJzZWN0aW9uX2NvdW50KSkKCmBgYAoKCgpgYGB7cn0KZ2dwbG90KHN1bSwgYWVzKHg9eWVhcikpICsKICB0aGVtZV9idygpICsKICBnZW9tX2xpbmUoYWVzKHk9IHN1bV9QSCksIGNvbG91ciA9ICJibHVlIiwgYWxwaGEgPSAwLjksIGxpbmV0eXBlPSJkb3RkYXNoIikgKwogIGdlb21fbGluZShhZXMoeT0gc3VtX0NDKSwgY29sb3VyID0gImRhcmtncmVlbiIsIGFscGhhID0gMC45LCBsaW5ldHlwZT0iZGFzaGVkIikgKwojICBnZW9tX2xpbmUoYWVzKHk9IGNvdW50KSwgY29sb3VyID0gImJsYWNrIiwgYWxwaGEgPSAwLjkpICsKICAjZ2d0aXRsZSgiUG9saXRpY2FsIGVuZ2FnZW1lbnQgd2l0aCB0aGUgaW50ZXJzZWN0aW9uIG9mIGNsaW1hdGUgY2hhbmdlIGFuZCBoZWFsdGgiKSArIAogIHlsYWIoIlRvdGFsIG51bWJlciBvZiByZWZlcmVuY2VzIHBlciBVTkdEIHNlc3Npb24iKSArIHhsYWIoIlllYXIiKSArIAojICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwgMTQwKSwgYnJlYWtzID0gYygxLCA1MCwgMTAwLCAxMzQpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDE5NzAsIDIwMTgpLCBicmVha3MgPSBjKDE5NzAsIDE5ODAsIDE5OTAsIDIwMDAsIDIwMTAsIDIwMTgpKSsKIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDIwMDAsIHkgPSA4NTAsIGxhYmVsID0gIkNsaW1hdGUgQ2hhbmdlIiwgY29sb3VyID0gImRhcmtncmVlbiIpKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDE5OTMsIHkgPSAyNTAsIGxhYmVsID0gIkhlYWx0aCIsIGNvbG91ciA9ICJibHVlIikKCmdnc2F2ZSgidGltZXNlcmllc19QSENDX3RvdGFsX2NvdW50LnBkZiIpCmBgYAoKCgpgYGB7cn0KZ2dwbG90KHN1bSwgYWVzKHg9eWVhcikpICsKICB0aGVtZV9idygpICsKICBnZW9tX2xpbmUoYWVzKHk9IHN1bV9pbnQpLCBjb2xvdXIgPSAicmVkIiwgYWxwaGEgPSAwLjkpICsKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKyAKIyAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsIDE0MCksIGJyZWFrcyA9IGMoMSwgNTAsIDEwMCwgMTM0KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE4KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE4KSkgKwogICBhbm5vdGF0ZSgidGV4dCIsIHggPSAyMDE1LCB5ID0gMjAsIGxhYmVsID0gIkludGVyc2VjdGlvbiIsIGNvbG91ciA9ICJyZWQiKQoKZ2dzYXZlKCJ0aW1lc2VyaWVzX2ludGVyc2VjdGlvbl90b3RhbF9jb3VudC5wZGYiKQpgYGAKCgoKYGBge3J9CnJlYWRyOjp3cml0ZV9jc3Yoc3VtLCAiZmlndXJlNTcuY3N2IikKYGBgCgoKCgpgYGB7cn0KZ2dwbG90KHN1bSwgYWVzKHg9eWVhcikpICsKICB0aGVtZV9idygpICsKICBnZW9tX2xpbmUoYWVzKHk9IHN1bV9QSCksIGNvbG91ciA9ICJibHVlIiwgYWxwaGEgPSAwLjksIGxpbmV0eXBlPSJkb3RkYXNoIikgKwogIGdlb21fbGluZShhZXMoeT0gc3VtX0NDKSwgY29sb3VyID0gImRhcmtncmVlbiIsIGFscGhhID0gMC45LCBsaW5ldHlwZT0iZGFzaGVkIikgKwogIGdlb21fbGluZShhZXMoeT0gc3VtX2ludCksIGNvbG91ciA9ICJyZWQiLCBhbHBoYSA9IDAuOSkgKwogICNnZ3RpdGxlKCJQb2xpdGljYWwgZW5nYWdlbWVudCB3aXRoIHRoZSBpbnRlcnNlY3Rpb24gb2YgY2xpbWF0ZSBjaGFuZ2UgYW5kIGhlYWx0aCIpICsgCiAgeWxhYigiVG90YWwgbnVtYmVyIG9mIHJlZmVyZW5jZXMgcGVyIFVOR0Qgc2Vzc2lvbiIpICsgeGxhYigiWWVhciIpICsgCiMgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCAxNDApLCBicmVha3MgPSBjKDEsIDUwLCAxMDAsIDEzNCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOCksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOCkpKwogYW5ub3RhdGUoInRleHQiLCB4ID0gMjAwMCwgeSA9IDg1MCwgbGFiZWwgPSAiQ2xpbWF0ZSBDaGFuZ2UiLCBjb2xvdXIgPSAiZGFya2dyZWVuIikrCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMTk5MywgeSA9IDI1MCwgbGFiZWwgPSAiSGVhbHRoIiwgY29sb3VyID0gImJsdWUiKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMjAxNSwgeSA9IDEwMCwgbGFiZWwgPSAiSW50ZXJzZWN0aW9uIiwgY29sb3VyID0gInJlZCIpCgpnZ3NhdmUoInRpbWVzZXJpZXNfYWxsX3RvdGFsX2NvdW50LnBkZiIpCmBgYAoKCgoKCgoKCgoKCiMjIFByb3BvcnRpb24gb2YgY291bnRyaWVzIHByZXNlbnRhdGlvbgoKUHJvcG9ydGlvbiBvZiBjb3VudHJpZXMgdGhhdCBoYWQgYXQgbGVhc3Qgb25lIG1lbnRpb24KCkRhdGEgcHJlcGFyYXRpb24KCmBgYHtyfQoKY2xpbWF0ZV9zcGVlY2hlcyA8LSB0b3RhbF9jb3VudHMgJT4lIGZpbHRlcihjbGltYXRlX2NvdW50PjApICU+JSBncm91cF9ieSh5ZWFyKSAlPiUgdGFsbHkobmFtZSA9ICJjbGltYXRlX3NwZWVjaGVzIikKaGVhbHRoX3NwZWVjaGVzIDwtIHRvdGFsX2NvdW50cyAlPiUgZmlsdGVyKGhlYWx0aF9jb3VudD4wKSAlPiUgZ3JvdXBfYnkoeWVhcikgJT4lIHRhbGx5KG5hbWUgPSAiaGVhbHRoX3NwZWVjaGVzIikKaW50ZXJzZWN0aW9uX3NwZWVjaGVzIDwtIHRvdGFsX2NvdW50cyAlPiUgZmlsdGVyKGludGVyc2VjdGlvbl9jb3VudD4wKSAlPiUgZ3JvdXBfYnkoeWVhcikgJT4lIHRhbGx5KG5hbWUgPSAiaW50ZXJzZWN0aW9uX3NwZWVjaGVzIikKdG90YWxfc3BlZWNoZXMgPC0gdW5nZF9maWxlcyAlPiUgZ3JvdXBfYnkoWWVhcikgJT4lIHRhbGx5KG5hbWUgPSAidG90YWxfc3BlZWNoZXMiKQoKcHJvcG9ydGlvbnMgPC0gbGVmdF9qb2luKHRvdGFsX3NwZWVjaGVzLCBoZWFsdGhfc3BlZWNoZXMsIGJ5ID0gYygiWWVhciI9InllYXIiKSkgJT4lIAogIGxlZnRfam9pbiguLCBjbGltYXRlX3NwZWVjaGVzLCBieSA9IGMoIlllYXIiPSJ5ZWFyIikpICU+JSAKICBsZWZ0X2pvaW4oLiwgaW50ZXJzZWN0aW9uX3NwZWVjaGVzLCBieSA9IGMoIlllYXIiPSJ5ZWFyIikpICU+JSAKICByZXBsYWNlX25hKGxpc3QoaGVhbHRoX3NwZWVjaGVzPTAsIGNsaW1hdGVfc3BlZWNoZXM9MCwgaW50ZXJzZWN0aW9uX3NwZWVjaGVzPTApKQoKcHJvcG9ydGlvbnMkcGVyY2VudF9pbnQgPC0gcHJvcG9ydGlvbnMkaW50ZXJzZWN0aW9uX3NwZWVjaGVzL3Byb3BvcnRpb25zJHRvdGFsX3NwZWVjaGVzKjEwMApwcm9wb3J0aW9ucyRwZXJjZW50X0NDIDwtIHByb3BvcnRpb25zJGNsaW1hdGVfc3BlZWNoZXMvcHJvcG9ydGlvbnMkdG90YWxfc3BlZWNoZXMqMTAwCnByb3BvcnRpb25zJHBlcmNlbnRfUEggPC0gcHJvcG9ydGlvbnMkaGVhbHRoX3NwZWVjaGVzL3Byb3BvcnRpb25zJHRvdGFsX3NwZWVjaGVzKjEwMAoKcmVhZHI6OndyaXRlX2Nzdihwcm9wb3J0aW9ucywgInByb3BvcnRpb25fcmVzdWx0cy5jc3YiKQpgYGAKCgpQbG90dGluZyB0aGUgY291bnRyeSBwcm9wb3J0aW9uCgoKYGBge3J9CmdncGxvdChwcm9wb3J0aW9ucywgYWVzKHg9WWVhciwgeT1wZXJjZW50X0NDLCBncm91cCA9IDEpKSArCiAgZ2VvbV9saW5lKGNvbG91cj0iZGFya2dyZWVuIiwgc2l6ZT0xKSArCiAgdGhlbWVfYncoKSArCiAgI2dndGl0bGUoIlBvbGl0aWNhbCBlbmdhZ2VtZW50IHdpdGggdGhlIGludGVyc2VjdGlvbiBvZiBjbGltYXRlIGNoYW5nZSBhbmQgaGVhbHRoIikgKyAKICB5bGFiKCJQcm9wb3J0aW9uIG9mIGNvdW50cmllcyBkaXNjdXNzaW5nIGNsaW1hdGUgY2hhbmdlLCAlIikgKyB4bGFiKCJZZWFyIikgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOCksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOCkpCgogZ2dzYXZlKCJ0b3RhbF9wZXJjZW50X0NDLnBkZiIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QocHJvcG9ydGlvbnMsIGFlcyh4PVllYXIsIHk9cGVyY2VudF9QSCwgZ3JvdXAgPSAxKSkgKwogIGdlb21fbGluZShjb2xvdXI9ImJsdWUiLCBzaXplPTEpICsKICB0aGVtZV9idygpICsKICAjZ2d0aXRsZSgiUG9saXRpY2FsIGVuZ2FnZW1lbnQgd2l0aCB0aGUgaW50ZXJzZWN0aW9uIG9mIGNsaW1hdGUgY2hhbmdlIGFuZCBoZWFsdGgiKSArIAogIHlsYWIoIlByb3BvcnRpb24gb2YgY291bnRyaWVzIGRpc2N1c3NpbmcgaGVhbHRoLCAlIikgKyB4bGFiKCJZZWFyIikgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOCksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwyMDEwLCAyMDE4KSkKCiAgZ2dzYXZlKCJ0b3RhbF9wZXJjZW50X1BILnBkZiIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QocHJvcG9ydGlvbnMsIGFlcyh4PVllYXIsIHk9cGVyY2VudF9pbnQsIGdyb3VwID0gMSkpICsKICBnZW9tX2xpbmUoY29sb3VyPSJyZWQiLCBzaXplPTEpICsKICB0aGVtZV9idygpICsKICAjZ2d0aXRsZSgiUG9saXRpY2FsIGVuZ2FnZW1lbnQgd2l0aCB0aGUgaW50ZXJzZWN0aW9uIG9mIGNsaW1hdGUgY2hhbmdlIGFuZCBoZWFsdGgiKSArIAogIHlsYWIoIlByb3BvcnRpb24gb2YgY291bnRyaWVzIGRpc2N1c3NpbmcgaW50ZXJzZWN0aW9uLCAlIikgKyB4bGFiKCJZZWFyIikgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOCksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOCkpCgogIGdnc2F2ZSgidG90YWxfcGVyY2VudF9pbnRlcnNlY3Rpb24ucGRmIikKYGBgCgoKYGBge3J9CmdncGxvdChwcm9wb3J0aW9ucywgYWVzKHg9WWVhcikpICsKICBnZW9tX2xpbmUoYWVzKHk9cGVyY2VudF9pbnQpLCBjb2xvdXI9InJlZCIsIHNpemU9MSkgKwogIGdlb21fbGluZShhZXMoeT1wZXJjZW50X0NDKSwgY29sb3VyPSJkYXJrZ3JlZW4iLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplPTEpICsKICBnZW9tX2xpbmUoYWVzKHk9cGVyY2VudF9QSCksIGNvbG91cj0iYmx1ZSIsIGxpbmV0eXBlID0gImRvdGRhc2giLCBzaXplPTEpICsKICB0aGVtZV9idygpICsKICAjZ2d0aXRsZSgiUG9saXRpY2FsIGVuZ2FnZW1lbnQgd2l0aCB0aGUgaW50ZXJzZWN0aW9uIG9mIGNsaW1hdGUgY2hhbmdlIGFuZCBoZWFsdGgiKSArIAogIHlsYWIoIlByb3BvcnRpb24gb2YgY291bnRyaWVzLCAlIikgKyB4bGFiKCJZZWFyIikgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOCksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOCkpKwogYW5ub3RhdGUoInRleHQiLCB4ID0gMjAxNCwgeSA9IDMwLCBsYWJlbCA9ICJJbnRlcnNlY3Rpb24iLCBjb2xvdXIgPSAicmVkIikrCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMTk3NSwgeSA9IDU1LCBsYWJlbCA9ICJIZWFsdGgiLCBjb2xvdXIgPSAiYmx1ZSIpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxOTg4LCB5ID0gMjcsIGxhYmVsID0gIkNsaW1hdGUgQ2hhbmdlIiwgY29sb3VyID0gImRhcmtncmVlbiIpCgogIGdnc2F2ZSgiYWxsX3RocmVlX3BlcmNlbnQucGRmIikKYGBgCgoKCgoKI1RpZXIgQW5hbHlzaXMKCgpgYGB7cn0Kc2lkc19jb3VudHJpZXMgPC0gYygiQVNNIiwiQUlBIiwiQVRHIiwiQUJXIiwiQkhTIiwiQkhSIiwiQlJCIiwiQkxaIiwiQk1VIiwiQ1BWIiwiQ09NIiwiQ09LIiwiQ1VCIiwiRE1BIiwiRE9NIiwiRkpJIiwiR1JEIiwiR1VNIiwiR05CIiwiR1VZIiwiSFRJIiwiSkFNIiwiS0lSIiwiTURWIiwiTUhMIiwiTVVTIiwiRlNNIiwiTVNSIiwiTlJVIiwiTkNMIiwiTklVIiwiUExXIiwiUE5HIiwiUFJJIiwiS05BIiwiTENBIiwiVkNUIiwiV1NNIiwiU1RQIiwiU1lDIiwiU0dQIiwiU0xCIiwiU1VSIiwiVExTIiwiVE9OIiwiVFRPIiwiVFVWIiwiVlVUIikKdGllcjFfY291bnRyaWVzIDwtIGMoIlVTQSIsIkVVIiwgIkNITiIpCnRpZXIyX2NvdW50cmllcyA8LSBjKCJQT0wiLCJBVVMiLCAiWkFGIiwgIkJSQSIsICJJTkQiLCAiRlJBIiwgIkRFVSIsICJJRE4iLCAiR0JSIikKCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3VwcyA8LSBpZmVsc2UodG90YWxfY291bnRzJGNvdW50cnkgJWluJSBzaWRzX2NvdW50cmllcywgIlNJRFMiLCAibm9uZSIpCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeSAlaW4lIHRpZXIxX2NvdW50cmllc10gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnkgJWluJSB0aWVyMl9jb3VudHJpZXNdIDwtICJUaWVyMiIKCiNldSBwcmVzaWRlbmNpZXMKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkJFTCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTcwXSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJJVEEiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk3MV0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiTkxEIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5NzJdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkROSyIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTczXSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJGUkEiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk3NF0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiSVRBIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5NzVdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIk5MRCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTc2XSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJCRUwiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk3N10gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiREVVIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5NzhdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIklSTCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTc5XSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJMVVgiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk4MF0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiR0JSIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5ODFdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkROSyIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTgyXSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJHUkMiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk4M10gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiSVJMIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5ODRdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkxVWCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTg1XSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJHQlIiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk4Nl0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiRE5LIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5ODddIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkdSQyIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTg4XSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJGUkEiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk4OV0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiSVRBIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5OTBdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIk5MRCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTkxXSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJHQlIiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk5Ml0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiQkVMIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5OTNdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkRFVSIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTk0XSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJFU1AiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk5NV0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiSVJMIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5OTZdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkxVWCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTk3XSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJBVVQiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk5OF0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiRklOIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5OTldIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkZSQSIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAyMDAwXSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJCRUwiICYgdG90YWxfY291bnRzJHllYXIgPT0gMjAwMV0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiRE5LIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDIwMDJdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIklUQSIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAyMDAzXSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJOTEQiICYgdG90YWxfY291bnRzJHllYXIgPT0gMjAwNF0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiR0JSIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDIwMDVdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkZJTiIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAyMDA2XSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJQUlQiICYgdG90YWxfY291bnRzJHllYXIgPT0gMjAwN10gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiRlJBIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDIwMDhdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIlNXRSIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAyMDA5XSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJCRUwiICYgdG90YWxfY291bnRzJHllYXIgPT0gMjAxMF0gPC0gIlRpZXIxIgoKCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHMgPC0gaWZlbHNlKHVuZ2RfZmlsZXMkQ291bnRyeSAlaW4lIHNpZHNfY291bnRyaWVzLCAiU0lEUyIsICJub25lIikKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnkgJWluJSB0aWVyMV9jb3VudHJpZXNdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnkgJWluJSB0aWVyMl9jb3VudHJpZXNdIDwtICJUaWVyMiIKCgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJCRUwiICYgdW5nZF9maWxlcyRZZWFyID09IDE5NzBdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiSVRBIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTcxXSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIk5MRCIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk3Ml0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJETksiICYgdW5nZF9maWxlcyRZZWFyID09IDE5NzNdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiRlJBIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTc0XSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIklUQSIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk3NV0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJOTEQiICYgdW5nZF9maWxlcyRZZWFyID09IDE5NzZdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiQkVMIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTc3XSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIkRFVSIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk3OF0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJJUkwiICYgdW5nZF9maWxlcyRZZWFyID09IDE5NzldIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiTFVYIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTgwXSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIkdCUiIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk4MV0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJETksiICYgdW5nZF9maWxlcyRZZWFyID09IDE5ODJdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiR1JDIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTgzXSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIklSTCIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk4NF0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJMVVgiICYgdW5nZF9maWxlcyRZZWFyID09IDE5ODVdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiR0JSIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTg2XSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIkROSyIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk4N10gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJHUkMiICYgdW5nZF9maWxlcyRZZWFyID09IDE5ODhdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiRlJBIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTg5XSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIklUQSIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk5MF0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJOTEQiICYgdW5nZF9maWxlcyRZZWFyID09IDE5OTFdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiR0JSIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTkyXSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIkJFTCIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk5M10gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJERVUiICYgdW5nZF9maWxlcyRZZWFyID09IDE5OTRdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiRVNQIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTk1XSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIklSTCIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk5Nl0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJMVVgiICYgdW5nZF9maWxlcyRZZWFyID09IDE5OTddIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiQVVUIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTk4XSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIkZJTiIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk5OV0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJGUkEiICYgdW5nZF9maWxlcyRZZWFyID09IDIwMDBdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiQkVMIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAyMDAxXSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIkROSyIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMjAwMl0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJJVEEiICYgdW5nZF9maWxlcyRZZWFyID09IDIwMDNdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiTkxEIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAyMDA0XSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIkdCUiIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMjAwNV0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJGSU4iICYgdW5nZF9maWxlcyRZZWFyID09IDIwMDZdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiUFJUIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAyMDA3XSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIkZSQSIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMjAwOF0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJTV0UiICYgdW5nZF9maWxlcyRZZWFyID09IDIwMDldIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiQkVMIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAyMDEwXSA8LSAiVGllcjEiCgoKYGBgCgoKYGBge3J9CgpjbGltYXRlX3NwZWVjaGVzX2dyb3VwcyA8LSB0b3RhbF9jb3VudHMgJT4lIGZpbHRlcihjbGltYXRlX2NvdW50PjApICU+JSBncm91cF9ieSh5ZWFyLCBjb3VudHJ5X2dyb3VwcykgJT4lIHRhbGx5KG5hbWUgPSAiY2xpbWF0ZV9zcGVlY2hlcyIpCgpoZWFsdGhfc3BlZWNoZXNfZ3JvdXBzIDwtIHRvdGFsX2NvdW50cyAlPiUgZmlsdGVyKGhlYWx0aF9jb3VudD4wKSAlPiUgZ3JvdXBfYnkoeWVhciwgY291bnRyeV9ncm91cHMpICU+JSB0YWxseShuYW1lID0gImhlYWx0aF9zcGVlY2hlcyIpCgppbnRlcnNlY3Rpb25fc3BlZWNoZXNfZ3JvdXBzIDwtIHRvdGFsX2NvdW50cyAlPiUgZmlsdGVyKGludGVyc2VjdGlvbl9jb3VudD4wKSAlPiUgZ3JvdXBfYnkoeWVhciwgY291bnRyeV9ncm91cHMpICU+JSB0YWxseShuYW1lID0gImludGVyc2VjdGlvbl9zcGVlY2hlcyIpCgoKdG90YWxfc3BlZWNoZXNfZ3JvdXBzIDwtIHVuZ2RfZmlsZXMgJT4lIAogIGdyb3VwX2J5KFllYXIsIGNvdW50cnlfZ3JvdXBzKSAlPiUgdGFsbHkobmFtZSA9ICJ0b3RhbF9zcGVlY2hlcyIpCgpwcm9wb3J0aW9uc19ncm91cHMgPC0gbGVmdF9qb2luKHRvdGFsX3NwZWVjaGVzX2dyb3VwcywgaGVhbHRoX3NwZWVjaGVzX2dyb3VwcywgYnkgPSBjKCJZZWFyIj0ieWVhciIsICJjb3VudHJ5X2dyb3VwcyIpKSAlPiUgCiAgbGVmdF9qb2luKC4sIGNsaW1hdGVfc3BlZWNoZXNfZ3JvdXBzLCBieSA9IGMoIlllYXIiPSJ5ZWFyIiwgImNvdW50cnlfZ3JvdXBzIikpICU+JSAKICBsZWZ0X2pvaW4oLiwgaW50ZXJzZWN0aW9uX3NwZWVjaGVzX2dyb3VwcywgYnkgPSBjKCJZZWFyIj0ieWVhciIsICJjb3VudHJ5X2dyb3VwcyIpKSAlPiUgCiAgcmVwbGFjZV9uYShsaXN0KGhlYWx0aF9zcGVlY2hlcz0wLCBjbGltYXRlX3NwZWVjaGVzPTAsIGludGVyc2VjdGlvbl9zcGVlY2hlcz0wKSkKCnByb3BvcnRpb25zX2dyb3VwcyRwZXJjZW50X2ludCA8LSBwcm9wb3J0aW9uc19ncm91cHMkaW50ZXJzZWN0aW9uX3NwZWVjaGVzL3Byb3BvcnRpb25zX2dyb3VwcyR0b3RhbF9zcGVlY2hlcyoxMDAKCnByb3BvcnRpb25zX2dyb3VwcyRwZXJjZW50X0NDIDwtIHByb3BvcnRpb25zX2dyb3VwcyRjbGltYXRlX3NwZWVjaGVzL3Byb3BvcnRpb25zX2dyb3VwcyR0b3RhbF9zcGVlY2hlcyoxMDAKCnByb3BvcnRpb25zX2dyb3VwcyRwZXJjZW50X1BIIDwtIHByb3BvcnRpb25zX2dyb3VwcyRoZWFsdGhfc3BlZWNoZXMvcHJvcG9ydGlvbnNfZ3JvdXBzJHRvdGFsX3NwZWVjaGVzKjEwMAoKcHJvcG9ydGlvbnNfZ3JvdXBzIDwtIHByb3BvcnRpb25zX2dyb3VwcyAlPiUgZmlsdGVyKGNvdW50cnlfZ3JvdXBzIT0ibm9uZSIpCgpgYGAKCgojI1RvdGFsIGNvdW50IHBsb3RzIGJ5IGNvdW50cnkgZ3JvdXAKCmBgYHtyfQpnZ3Bsb3QocHJvcG9ydGlvbnNfZ3JvdXBzLCBhZXMoeD1ZZWFyLCB5PWhlYWx0aF9zcGVlY2hlcywgZ3JvdXA9Y291bnRyeV9ncm91cHMsIGxpbmV0eXBlID0gY291bnRyeV9ncm91cHMsIGNvbG91ciA9IGNvdW50cnlfZ3JvdXBzKSkgKwogICAgZ2VvbV9saW5lKCkgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKHRpdGxlPU5VTEwpLCBsaW5ldHlwZSA9IEZBTFNFKSArCiBndWlkZXMobGluZXR5cGU9Z3VpZGVfbGVnZW5kKHRpdGxlPU5VTEwpKSArCiAgdGhlbWVfYncoKSArCiAgZ2d0aXRsZSgiSGVhbHRoIikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE4KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE4KSkKCiAgZ2dzYXZlKCJQSF90b3RhbF9ieV9jb3VudHJ5X2dyb3VwLnBkZiIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QocHJvcG9ydGlvbnNfZ3JvdXBzLCBhZXMoeD1ZZWFyLCB5PWNsaW1hdGVfc3BlZWNoZXMsIGdyb3VwPWNvdW50cnlfZ3JvdXBzLCBsaW5ldHlwZSA9IGNvdW50cnlfZ3JvdXBzLCBjb2xvdXIgPSBjb3VudHJ5X2dyb3VwcykpICsKICAgIGdlb21fbGluZSgpICsKICBndWlkZXMoY29sb3VyPWd1aWRlX2xlZ2VuZCh0aXRsZT1OVUxMKSwgbGluZXR5cGUgPSBGQUxTRSkgKwogZ3VpZGVzKGxpbmV0eXBlPWd1aWRlX2xlZ2VuZCh0aXRsZT1OVUxMKSkgKwogIHRoZW1lX2J3KCkgKwogIGdndGl0bGUoIkNsaW1hdGUgQ2hhbmdlIikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE4KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE4KSkKCiAgZ2dzYXZlKCJDQ190b3RhbF9ieV9jb3VudHJ5X2dyb3VwLnBkZiIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QocHJvcG9ydGlvbnNfZ3JvdXBzLCBhZXMoeD1ZZWFyLCB5PWludGVyc2VjdGlvbl9zcGVlY2hlcywgZ3JvdXA9Y291bnRyeV9ncm91cHMsIGxpbmV0eXBlID0gY291bnRyeV9ncm91cHMsIGNvbG91ciA9IGNvdW50cnlfZ3JvdXBzKSkgKwogICAgZ2VvbV9saW5lKCkgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKHRpdGxlPU5VTEwpLCBsaW5ldHlwZSA9IEZBTFNFKSArCiBndWlkZXMobGluZXR5cGU9Z3VpZGVfbGVnZW5kKHRpdGxlPU5VTEwpKSArCiAgdGhlbWVfYncoKSArCiAgZ2d0aXRsZSgiSW50ZXJzZWN0aW9uIikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE4KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE4KSkKCiAgZ2dzYXZlKCJpbnRlcnNlY3Rpb25fdG90YWxfYnlfY291bnRyeV9ncm91cC5wZGYiKQpgYGAKCgoKIyNQcm9wb3J0aW9uIHBsb3RzIGJ5IGNvdW50cnkgZ3JvdXAKCgpgYGB7cn0KZ2dwbG90KHByb3BvcnRpb25zX2dyb3VwcywgYWVzKHg9WWVhciwgeT1wZXJjZW50X1BILCBncm91cD1jb3VudHJ5X2dyb3VwcywgbGluZXR5cGUgPSBjb3VudHJ5X2dyb3VwcywgY29sb3VyID0gY291bnRyeV9ncm91cHMpKSArCiAgICBnZW9tX2xpbmUoKSArCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCksIGxpbmV0eXBlID0gRkFMU0UpICsKIGd1aWRlcyhsaW5ldHlwZT1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCkpICsKICB0aGVtZV9idygpICsKICBnZ3RpdGxlKCJEaXNjdXNzaW9uIG9mIEhlYWx0aCIpICsgCiAgeWxhYigiUHJvcG9ydGlvbiBvZiBDb3VudHJpZXMsICUiKSArIHhsYWIoIlllYXIiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDE5NzAsIDIwMTgpLCBicmVha3MgPSBjKDE5NzAsIDE5ODAsIDE5OTAsIDIwMDAsICAyMDEwLCAyMDE4KSkKCiAgZ2dzYXZlKCJQSF9wZXJjZW50X2NvdW50cnlfZ3JvdXAucGRmIikKYGBgCgoKCgpgYGB7cn0KZ2dwbG90KHByb3BvcnRpb25zX2dyb3VwcywgYWVzKHg9WWVhciwgeT1wZXJjZW50X0NDLCBncm91cD1jb3VudHJ5X2dyb3VwcywgbGluZXR5cGUgPSBjb3VudHJ5X2dyb3VwcywgY29sb3VyID0gY291bnRyeV9ncm91cHMpKSArCiAgICBnZW9tX2xpbmUoKSArCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCksIGxpbmV0eXBlID0gRkFMU0UpICsKIGd1aWRlcyhsaW5ldHlwZT1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCkpICsKICB0aGVtZV9idygpICsKICBnZ3RpdGxlKCJEaXNjdXNzaW9uIG9mIENsaW1hdGUgQ2hhbmdlIikgKyAKICB5bGFiKCJQcm9wb3J0aW9uIG9mIENvdW50cmllcywgJSIpICsgeGxhYigiWWVhciIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOCksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOCkpCgogIGdnc2F2ZSgiQ0NfcGVyY2VudF9jb3VudHJ5X2dyb3VwLnBkZiIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QocHJvcG9ydGlvbnNfZ3JvdXBzLCBhZXMoeD1ZZWFyLCB5PXBlcmNlbnRfaW50LCBncm91cD1jb3VudHJ5X2dyb3VwcywgbGluZXR5cGUgPSBjb3VudHJ5X2dyb3VwcywgY29sb3VyID0gY291bnRyeV9ncm91cHMpKSArCiAgICBnZW9tX2xpbmUoKSArCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCksIGxpbmV0eXBlID0gRkFMU0UpICsKIGd1aWRlcyhsaW5ldHlwZT1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCkpICsKICB0aGVtZV9idygpICsKICBnZ3RpdGxlKCJEaXNjdXNzaW9uIG9mIGludGVyc2VjdGlvbiIpICsgCiAgeWxhYigiUHJvcG9ydGlvbiBvZiBDb3VudHJpZXMsICUiKSArIHhsYWIoIlllYXIiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDE5NzAsIDIwMTgpLCBicmVha3MgPSBjKDE5NzAsIDE5ODAsIDE5OTAsIDIwMDAsIDIwMTAsIDIwMTgpKQoKICBnZ3NhdmUoImludGVyc2VjdGlvbl9wZXJjZW50X2NvdW50cnlfZ3JvdXAucGRmIikKYGBgCgoKCgoKI1dITyByZWdpb25zCgojIyBUb3RhbCBjb3VudHMgYnkgV0hPIHJlZ2lvbgoKVXNpbmcgVU4gTTQ5IFN0YW5kYXJkIChTdGFuZGFyZCBjb3VudHJ5IG9yIGFyZWEgY29kZXMgZm9yIHN0YXRpc3RpY2FsIHVzZSAoTTQ5KSkgd2UgY3JlYXRlIHJlZ2lvbmFsIGFuZCBzdWItcmVnaW9uYWwgZ3JvdXBpbmdzIG9mIGNvdW50cmllcy4gW2h0dHBzOi8vdW5zdGF0cy51bi5vcmcvdW5zZC9tZXRob2RvbG9neS9tNDkvXQoKCmBgYHtyfQojbG9hZGluZyBXSE8gcmVnaW9ucyBjb3VudHJ5IGlkZW50aWZpZXJzIGFuZCBwcmVwcm9jZXNzaW5nCnJlZ2lvbnMgPC0gcmVhZHI6OnJlYWRfY3N2KCIuLi9VTlNEIC0gTWV0aG9kb2xvZ3kuY3N2IikKCiNVTkdEQyB1c2VkIFlVRyBkZXNpZ25hdGlvbiB3aGlsZSBXSE8gaXMgdXNpbmcgU1JCCnRvdGFsX2NvdW50cyRjb3VudHJ5IDwtIHN0cl9yZXBsYWNlKHRvdGFsX2NvdW50cyRjb3VudHJ5LCAiWVVHIiwgIlNSQiIpCgojbWVyZ2luZyBXSE8gZGVzaWduYXRpb25zIHdpdGggbWVudGlvbiBjb3VudHMKcmVnaW9uYWxfZGF0YSA8LSBpbm5lcl9qb2luKHRvdGFsX2NvdW50cywgcmVnaW9ucywgYnkgPSBjKCJjb3VudHJ5IiA9ICJJU08tYWxwaGEzIENvZGUiKSkKCiMgdG90YWwgc3VtIG9mIG1lbnRpb24gY291bnRzIGJ5IHllYXIgYW5kIFdITyByZWdpb24sIHdpdGggbWVhbnMKd2hvX3N1bSA8LSBzdW1tYXJpc2UoZ3JvdXBfYnkocmVnaW9uYWxfZGF0YSwgeWVhciwgV0hPKSwgCiAgICAgICAgICAgICAgICAgICAgIHdob19pbnQgPSBzdW0oaW50ZXJzZWN0aW9uX2NvdW50KSwgd2hvX1BIID0gc3VtKGhlYWx0aF9jb3VudCksIHdob19DQyA9IHN1bShjbGltYXRlX2NvdW50KSkKCmBgYAoKYGBge3J9CnJlYWRyOjp3cml0ZV9jc3YocmVnaW9uYWxfZGF0YSwgIndob19yZWdpb25zX2RhdGEuY3N2IikKcmVhZHI6OndyaXRlX2Nzdih3aG9fc3VtLCAiZmlndXJlNTguY3N2IikKCmBgYAoKCgpQbG90IGJ5IHJlZ2lvbgoKCmBgYHtyfQpnZ3Bsb3Qod2hvX3N1bSwgYWVzKHg9eWVhciwgeT13aG9fUEgsIGdyb3VwPVdITywgbGluZXR5cGUgPSBXSE8sIGNvbG91ciA9IFdITykpICsKICAgIGdlb21fbGluZSgpICsKICBndWlkZXMoY29sb3VyPWd1aWRlX2xlZ2VuZCh0aXRsZT1OVUxMKSwgbGluZXR5cGUgPSBGQUxTRSkgKwogZ3VpZGVzKGxpbmV0eXBlPWd1aWRlX2xlZ2VuZCh0aXRsZT1OVUxMKSkgKwogIHRoZW1lX2J3KCkgKwogIGdndGl0bGUoIkhlYWx0aCIpICsgCiAgeWxhYigiVG90YWwgbnVtYmVyIG9mIHJlZmVyZW5jZXMgcGVyIFVOR0Qgc2Vzc2lvbiIpICsgeGxhYigiWWVhciIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOCksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOCkpCgogIGdnc2F2ZSgiUEhfdG90YWxfYnlfd2hvLnBkZiIpCmBgYAoKCgoKCmBgYHtyfQpnZ3Bsb3Qod2hvX3N1bSwgYWVzKHg9eWVhciwgeT13aG9fQ0MsIGdyb3VwPVdITywgbGluZXR5cGUgPSBXSE8sIGNvbG91ciA9IFdITykpICsKICAgIGdlb21fbGluZSgpICsKICBndWlkZXMoY29sb3VyPWd1aWRlX2xlZ2VuZCh0aXRsZT1OVUxMKSwgbGluZXR5cGUgPSBGQUxTRSkgKwogZ3VpZGVzKGxpbmV0eXBlPWd1aWRlX2xlZ2VuZCh0aXRsZT1OVUxMKSkgKwogIHRoZW1lX2J3KCkgKwogIGdndGl0bGUoIkNsaW1hdGUgQ2hhbmdlIikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE4KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE4KSkKCiAgZ2dzYXZlKCJDQ190b3RhbF9ieV93aG8ucGRmIikKYGBgCgoKCgpgYGB7cn0KZ2dwbG90KHdob19zdW0sIGFlcyh4PXllYXIsIHk9d2hvX2ludCwgZ3JvdXA9V0hPLCBsaW5ldHlwZSA9IFdITywgY29sb3VyID0gV0hPKSkgKwogICAgZ2VvbV9saW5lKCkgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKHRpdGxlPU5VTEwpLCBsaW5ldHlwZSA9IEZBTFNFKSArCiBndWlkZXMobGluZXR5cGU9Z3VpZGVfbGVnZW5kKHRpdGxlPU5VTEwpKSArCiAgdGhlbWVfYncoKSArCiAgZ2d0aXRsZSgiSW50ZXJzZWN0aW9uIikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE4KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE4KSkKCiAgZ2dzYXZlKCJpbnRlcnNlY3Rpb25fdG90YWxfYnlfd2hvLnBkZiIpCmBgYAoKCgoKCiMjIFByb3BvcnRpb24gYnkgV0hPIHJlZ2lvbgoKRGF0YSBwcmVwYXJhdGlvbgoKYGBge3J9CgpjbGltYXRlX3NwZWVjaGVzX3dobyA8LSByZWdpb25hbF9kYXRhICU+JSBmaWx0ZXIoY2xpbWF0ZV9jb3VudD4wKSAlPiUgZ3JvdXBfYnkoeWVhciwgV0hPKSAlPiUgdGFsbHkobmFtZSA9ICJjbGltYXRlX3NwZWVjaGVzIikKaGVhbHRoX3NwZWVjaGVzX3dobyA8LSByZWdpb25hbF9kYXRhICU+JSBmaWx0ZXIoaGVhbHRoX2NvdW50PjApICU+JSBncm91cF9ieSh5ZWFyLCBXSE8pICU+JSB0YWxseShuYW1lID0gImhlYWx0aF9zcGVlY2hlcyIpCmludGVyc2VjdGlvbl9zcGVlY2hlc193aG8gPC0gcmVnaW9uYWxfZGF0YSAlPiUgZmlsdGVyKGludGVyc2VjdGlvbl9jb3VudD4wKSAlPiUgZ3JvdXBfYnkoeWVhciwgV0hPKSAlPiUgdGFsbHkobmFtZSA9ICJpbnRlcnNlY3Rpb25fc3BlZWNoZXMiKQoKI21lcmdpbmcgV0hPIGRlc2lnbmF0aW9ucyB3aXRoIG1lbnRpb24gY291bnRzCnVuZ2RfZmlsZXMkQ291bnRyeSA8LSBzdHJfcmVwbGFjZSh1bmdkX2ZpbGVzJENvdW50cnksICJZVUciLCAiU1JCIikKCnRvdGFsX3NwZWVjaGVzX3dobyA8LSBpbm5lcl9qb2luKHVuZ2RfZmlsZXMsIHJlZ2lvbnMsIGJ5ID0gYygiQ291bnRyeSIgPSAiSVNPLWFscGhhMyBDb2RlIikpICU+JSAKICBncm91cF9ieShZZWFyLCBXSE8pICU+JSB0YWxseShuYW1lID0gInRvdGFsX3NwZWVjaGVzIikKCnByb3BvcnRpb25zX3dobyA8LSBsZWZ0X2pvaW4odG90YWxfc3BlZWNoZXNfd2hvLCBoZWFsdGhfc3BlZWNoZXNfd2hvLCBieSA9IGMoIlllYXIiPSJ5ZWFyIiwgIldITyIpKSAlPiUgCiAgbGVmdF9qb2luKC4sIGNsaW1hdGVfc3BlZWNoZXNfd2hvLCBieSA9IGMoIlllYXIiPSJ5ZWFyIiwgIldITyIpKSAlPiUgCiAgbGVmdF9qb2luKC4sIGludGVyc2VjdGlvbl9zcGVlY2hlc193aG8sIGJ5ID0gYygiWWVhciI9InllYXIiLCAiV0hPIikpICU+JSAKICByZXBsYWNlX25hKGxpc3QoaGVhbHRoX3NwZWVjaGVzPTAsIGNsaW1hdGVfc3BlZWNoZXM9MCwgaW50ZXJzZWN0aW9uX3NwZWVjaGVzPTApKQoKcHJvcG9ydGlvbnNfd2hvJHBlcmNlbnRfaW50IDwtIHByb3BvcnRpb25zX3dobyRpbnRlcnNlY3Rpb25fc3BlZWNoZXMvcHJvcG9ydGlvbnNfd2hvJHRvdGFsX3NwZWVjaGVzKjEwMApwcm9wb3J0aW9uc193aG8kcGVyY2VudF9DQyA8LSBwcm9wb3J0aW9uc193aG8kY2xpbWF0ZV9zcGVlY2hlcy9wcm9wb3J0aW9uc193aG8kdG90YWxfc3BlZWNoZXMqMTAwCnByb3BvcnRpb25zX3dobyRwZXJjZW50X1BIIDwtIHByb3BvcnRpb25zX3dobyRoZWFsdGhfc3BlZWNoZXMvcHJvcG9ydGlvbnNfd2hvJHRvdGFsX3NwZWVjaGVzKjEwMAoKYGBgCgoKYGBge3J9CnJlYWRyOjp3cml0ZV9jc3YocHJvcG9ydGlvbnNfd2hvLCAiZmlndXJlNTYuY3N2IikKYGBgCgoKUGxvdHRpbmcKCgpgYGB7cn0KZ2dwbG90KHByb3BvcnRpb25zX3dobywgYWVzKHg9WWVhciwgeT1wZXJjZW50X1BILCBncm91cD1XSE8sIGxpbmV0eXBlID0gV0hPLCBjb2xvdXIgPSBXSE8pKSArCiAgICBnZW9tX2xpbmUoKSArCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCksIGxpbmV0eXBlID0gRkFMU0UpICsKIGd1aWRlcyhsaW5ldHlwZT1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCkpICsKICB0aGVtZV9idygpICsKICBnZ3RpdGxlKCJEaXNjdXNzaW9uIG9mIEhlYWx0aCIpICsgCiAgeWxhYigiUHJvcG9ydGlvbiBvZiBDb3VudHJpZXMsICUiKSArIHhsYWIoIlllYXIiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDE5NzAsIDIwMTgpLCBicmVha3MgPSBjKDE5NzAsIDE5ODAsIDE5OTAsIDIwMDAsIDIwMTAsIDIwMTgpKQoKICBnZ3NhdmUoIlBIX3BlcmNlbnRfd2hvLnBkZiIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QocHJvcG9ydGlvbnNfd2hvLCBhZXMoeD1ZZWFyLCB5PXBlcmNlbnRfQ0MsIGdyb3VwPVdITywgbGluZXR5cGUgPSBXSE8sIGNvbG91ciA9IFdITykpICsKICAgIGdlb21fbGluZSgpICsKICBndWlkZXMoY29sb3VyPWd1aWRlX2xlZ2VuZCh0aXRsZT1OVUxMKSwgbGluZXR5cGUgPSBGQUxTRSkgKwogZ3VpZGVzKGxpbmV0eXBlPWd1aWRlX2xlZ2VuZCh0aXRsZT1OVUxMKSkgKwogIHRoZW1lX2J3KCkgKwogZ2d0aXRsZSgiRGlzY3Vzc2lvbiBvZiBDbGltYXRlIENoYW5nZSIpICsgCiAgeWxhYigiUHJvcG9ydGlvbiBvZiBDb3VudHJpZXMsICUiKSArIHhsYWIoIlllYXIiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDE5NzAsIDIwMTgpLCBicmVha3MgPSBjKDE5NzAsIDE5ODAsIDE5OTAsIDIwMDAsIDIwMTAsIDIwMTgpKQoKICBnZ3NhdmUoIkNDX3BlcmNlbnRfd2hvLnBkZiIpCmBgYAoKCgoKCmBgYHtyfQpnZ3Bsb3QocHJvcG9ydGlvbnNfd2hvLCBhZXMoeD1ZZWFyLCB5PXBlcmNlbnRfaW50LCBncm91cD1XSE8sIGxpbmV0eXBlID0gV0hPLCBjb2xvdXIgPSBXSE8pKSArCiAgICBnZW9tX2xpbmUoKSArCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCksIGxpbmV0eXBlID0gRkFMU0UpICsKIGd1aWRlcyhsaW5ldHlwZT1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCkpICsKICB0aGVtZV9idygpICsKICBnZ3RpdGxlKCJEaXNjdXNzaW9uIG9mIEludGVyc2VjdGlvbiIpICsgCiAgeWxhYigiUHJvcG9ydGlvbiBvZiBjb3VudHJpZXMsICUiKSArIHhsYWIoIlllYXIiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDE5NzAsIDIwMTgpLCBicmVha3MgPSBjKDE5NzAsIDE5ODAsIDE5OTAsIDIwMDAsIDIwMTAsIDIwMTgpKQoKICBnZ3NhdmUoImludGVyc2VjdGlvbl9wZXJjZW50X3doby5wZGYiKQpgYGAKCgoKCg==